2017-11-25 48 views
1

MVVMを使用してWPFアプリケーションを作成しましたが、ウィンドウの開閉に問題があります。私のログインウィンドウで、私がログインウインドウを閉じて、ボタンのクリックでWindowOPHomeウィンドウを開くには、次のメソッドを使用します。WPF MVVMウィンドウを閉じる

  WindowOPHome dashboard = new WindowOPHome(); 
      dashboard.Show(); 
      Application.Current.MainWindow.Close(); 

すべてが正常に動作してWindowOPHomeウィンドウが開いている間ログインウィンドウが閉じます。 WindowOPHomeウィンドウを閉じて、Login Window/WindowOPHomeアクションと同様のボタンをクリックしてWindowMainAdminウィンドウを開くと、WindowMainAdminウィンドウが分割されて開き、WindowOPHomeが決して見えなくなります。以下は、WindowOPHomeを閉じてWindowMainAdminを開くコードです。

 WindowMainAdmin dashboard = new WindowMainAdmin(); 
     dashboard.Show(); 
     Application.Current.MainWindow.Close(); 

ご協力いただければ幸いです!あなたが必要とする他のコードがあるかどうか教えてください。どうもありがとうございます!

答えて

1

現在のメインウィンドウではなく、閉じるウィンドウを明示的に閉じることをお勧めします。 MVVMで

あなたは、このようなコマンドパラメータを介して結合した振る舞いを使用するか、ビューモデルに窓を渡すことができ、それを行うにはさまざまな方法がたくさん、あります

ボタンXAMLでビューのためには:

if (parameter is System.Windows.Window) 
{ 
    WindowMainAdmin dashboard = new WindowMainAdmin(); 
    dashboard.Show(); 
    (parameter as System.Windows.Window).Close(); 
} 

:コマンドで

CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 

ビューモデルにおける方法を実行します。
また、必要なものが見つかるまで、すべてのウィンドウを反復することもできます。

foreach(Window window in Application.Current.Windows) { 
    if(window is WindowOPHome) 
    { 
     window.Close(); 
     break; 
    } 
} 

あなたが開いているウィンドウの複数のインスタンスを持っている必要がある場合はちょうどそのタイプの最初のものを閉じる以外の他のいくつかのプロパティをチェックすることをお勧めします。

あなたはそれを各ウィンドウクラス内の静的な終了メソッドにすることさえできます。

+0

パーフェクト!これは非常に簡単で、他のウィンドウを開いたままにして閉じる必要があるときに、あなたが言ったように、将来の使用に適応できます。ありがとうございました! – Progolfer79

1

管理ウィンドウを作成すると、管理ウィンドウは現在のメインウィンドウとみなされ、閉じます。これを避けるには、必要なウィンドウを明示的に閉じることができます。すべてのウィンドウを管理するためにMainViewModelを実装することをお勧めします。この例では、1つのウィンドウのみを開くことを前提としています。ビュー(任意のウィンドウ)で

:ViewModelにで

private void OnClose(object sender, RoutedEventArgs e) 
{ 
    //ICommand Implemnation that informs MainViewModel of UserInput 
    //In this case, the command ShowOPHome is an Enum 
    inputhandler.Execute(MyCommands.ShowOPHome); 
} 

BaseWindow dashboard; 
.... 
public void ShowWindow(MyCommands Param) 
{ 
    //Verify Parameter 
    .... 
    if(!(dashboard is null)) 
     dashboard.Close(); 
    switch(Param) 
    { 
     case MyCommands.ShowOPHome: 
      dashboard = new WindowOPHome(); 
      break; 
     case MyCommands.ShowMainAdmin: 
      dashboard = new WindowMainAdmin(); 
      break; 
    } 
    dashboard.Show(); 

} 

InputHandler:

public class Inputhandler : ICommand 
{ 
    ... 
    public class Execute(object Data) 
    { 
     ... 
      mainViewModel.ShowWindow(MyCommands.ShowOPHome); 
     ... 
    } 
    ... 
} 
1

あなたがカップルを使用してこの問題にMVVM純粋なソリューションを作成することができますヘルパークラスのクラス

012アプリケーションで

、最初

のViewModelに
private bool? _viewClosed; 

public bool? ViewClosed 
{ 
    get { return _viewClosed; } 
    set { 
      _viewClosed = value); 
      RaisePropertyChanged("ViewClosed"); 
     } 
} 

をプロパティを作成し、その後、当社のヘルパークラスを使用して、ビューでそれに結合します。

<Window x:Class=" 
     ... 
     vhelpers:ViewCloser.DialogResult="{Binding ViewClosed}" 
     ... 
     > 
0

これらはすべて素晴らしいソリューションです!私はcjmurphのソリューションを選択しました。なぜなら、これは非常にシンプルで(私の弱い心のために)、将来の使用のために簡単に適応できるからです。以下の実装コードを参照してください。もう一度、ありがとう!

XAML

Command="{Binding BtnMainAdminPageGO}" 
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 

WindowOPMainViewModel

private ICommand _btnMainAdminPage; 

    public ICommand BtnMainAdminPageGO 
    { 
     get 
     { 
      if (_btnMainAdminPage == null) 
      { 
       _btnMainAdminPage = new RelayCommand(param => this.BtnMainAdminPage(), null); 
      } 

      return _btnMainAdminPage; 
     } 
    } 

    private void BtnMainAdminPage() 
    { 
     WindowMainAdmin dashboard = new WindowMainAdmin(); 
     dashboard.Show(); 
     foreach(Window window in Application.Current.Windows) 
     { 
      if (window is WindowOPHome) 
      { 
       window.Close(); 
       break; 
      } 
     } 

    } 
+0

そこには長続きしない!あなたは私があなたに与えた2つの選択肢を混ぜ合わせました。 paramをコマンドのexecuteメソッドに渡すと、Windowsのコレクションを反復処理する必要はありません。 relayコマンドを宣言するときは、次のようにします:new RelayCommand(param => BtnMainAdminPage(param)、null); executeメソッドをprivateに変更します。void BtnMainAdminPage(object param){WindowMainAdmin dashboard = new WindowMainAdmin(); dashboard.show(); if(param is System.windows.Window)(System.Windows.Windowとしてのparam).Close();} – cjmurph

関連する問題