2017-11-20 7 views
0

をクリックしてください:変更ウィンドウ私は2つのプロジェクトを持っている私の現在のソリューションでは

1)モデルとビューモデルと

2)2つの窓、ログインウインドウを含むUIと呼ばれるプロジェクトを含有ClassLibraryプロジェクトMainWindow。

現在、UIプロジェクトには、ビューモデルを取得するためのClassLibraryプロジェクトへの参照があります。この問題は、ウィンドウをLoginWindowからMainWindowに変更したいときに発生します。私はいくつかの記事を読んで数日間インターネットを検索していますが、私が実際に探しているものに関して満足できる結果を出すものは何もありません。通常は、複数のビューを維持/切り替えする単一のウィンドウに関係します。それは私が望むものではありません。 LoginWindowをMainWindowに変更し、ボタンクリックでLoginWindowを閉じるようにします。これはどのように達成可能ですか?

Edit1:私はMVVMを使用していることを明確にする必要があり、適切なビューモデルにアクセスする必要があると思います。私は、必要なときにいつでも特定のウィンドウの新しいインスタンスを作成し、それを隠しながら表示することはできません。

EDIT2:

public static class MainTest 
{ 
    public static int Test() 
    { 
     Thread app = new Thread((ThreadStart)delegate 
     { 
      LoginWindow login = new LoginWindow(); 
      LoginViewModel loginVM = new LoginViewModel(); 

      if (loginVM.IsLoggedIn == false) 
      { 
       return -1; 
      } 
      else 
      { 
       MainWindow mainWindow = new MainWindow(); 
       mainWindow.Show(); 
      } 
     } 

     app.SetApartmentState(ApartmentState.STA); 
     app.Start(); 
     return 0; 
    } 

} 

[SOLVED] return -1で私はというエラーを取得:私はエラーを取得するapp.SetApartmentState(ApartmentState.STA);

"匿名関数が値を返すことはできませんデリゲートを返すのボイドに変換します" Argument2: 'void'から 'int'に変換できません。これはデリゲートと何か関係があると思いますが、コードの一番上に書いてあります。

EDIT3:私は通常これを行うには、メインクラスを使用

enter image description here

+0

? – rene

+0

'mainWindow.Show()'( 'mainWindow'は' MainWindow'オブジェクトです)と 'this.Close()'のヘルプを呼び出す 'MainWindow'のインスタンスを作成しませんか? –

+0

私はこれらの記事が示唆したことを試しましたが、ウィンドウ内で複数のビューを切り替えることに適用します。これは、私が達成しようとしているものではありません。https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm -2 /とhttp://www.technical-recipes.com/2016/switching-between-wpf-xaml-views-using-mvvm-datatriggers/ – Araine

答えて

0

  • (Visual Studioで、右のプロジェクトをクリック - >プロパティ)、プロジェクトのプロパティ

    public static int Main() 
    { 
        Thread app = new Thread((ThreadStart)delegate 
        { 
         MyLoginControl login = new MyLoginControl(); 
         MyLoginVM lvm = new MyLoginVM(); 
         login.DataConetxt = lvm; 
         login.ShowDialog(); 
         if (lvm.IsLoginFailed) 
         { 
          return; 
         } 
         else 
         { 
          MainWindow myApp = new MainWindow(); 
          MyAppVm avm = new MyAppVm(); 
          myApp.DataContext = avm; 
          myApp.ShowDialog(); 
         } 
        } 
        app.SetApartmentState(ApartmentState.STA); 
        app.Start(); 
        return 0; 
    } 
    
  • の内側に、このメソッドを持っているメインクラスを作成し、あなたのメインクラスを設定するアプリケーション]タブで起動オブジェクトとして

これにより、実際のアプリケーションを起動する前にログインを実行し、ログインビューrを終了せずに結果を確認することができますeturn

EDIT:VMをどのように使用できるかの例が追加されました。要点は、この方法であなたが望むことができることです。それは

唯一の目的は、ログイン・ビュー・リターン(通常は廃棄()は内部的にウィンドウのリターン上のアプリケーションの停止を引き起こして起動されます)、シャットダウン時にアプリケーションを防ぐためですEDIT2です:私の中の小さなエラーが発生しましたコード。固定

+0

私は、私のLoginViewModelにあるコードを使用することができないので、これがどうすればいいのか見てみてください。コマンドが実行され、必要なチェックが済んだら、ユーザ名とパスワードが正しいことを確認してから、 – Araine

+0

あなたの問題がどこにあるのか正直には分かりませんが、このアプローチはmvvm patterとは対照的ではありません。私のログイン用のVMもあります。このコードは例であり、あなたのニーズに基づいて変更する必要があります。 –

+0

私のソリューションは2つのプロジェクトに分割されています。つまり、ビューはビューモデルにアクセスできますが、ビューモデルはビューに直接アクセスできません(ビューモデルクラスではウィンドウのインスタンスを作成できません)あなたがshしている方法私の解決策には自分自身は当てはまりません。私が理にかなっていることを願っています。私の推測では、私がClassLibraryプロジェクトであなたの提案したクラスを作ってほしいということです。その結果、私はウィンドウのインスタンスを作成して表示することができません。 – Araine

0

お試しください app.configファイルで、StartupUri xamlをログインとして定義します。XAML:ログインattemtが成功したとき

  Application x:Class="CapronCRM.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="Login.xaml"> 

そして、あなたのログインXAMLで

は、このコードを呼び出す:

  MainWindow mw = new MainWindow(); 
      mw.Show(); 
      this.Close(); 
すでにあなたの要件を満たしていなかった試み、どのようにそれぞれが失敗したのソリューション
+0

MVVMを使用しており、LoginViewModelにあるコードにアクセスする必要があるため、これは機能しません。 – Araine

関連する問題