2017-07-05 27 views
0

WPFアプリケーションに2つのウィンドウがあり、メインウィンドウを閉じるともう一方のウィンドウも閉じます。WPFメインウィンドウの前のセカンダリウィンドウを閉じる

私は私のApp.xamlに設定することによって、これを達成:

ShutdownMode="OnMainWindowClose" 

を2つの窓は、私はいくつかのコンポーネントを非初期化するWindow_Closingイベントを持っています。私が達成したいのは、MainWindowを閉じると、第2ウィンドウのWindow_Closingイベントは、メインウィンドウの終了イベントの前に実行されなければならないということです。どのように私はこれを達成することができますか?

+0

タグ「MVVM」を削除しました。この質問はそれとは何の関係もなく、UI要素(この場合はWPFのウィンドウ)の動作に関するものです。異なるレイヤーでのアプリケーションの分離やViewModelsの存在は、ここでは重要ではありません。 –

+0

はい、私はMVVMのパターンに従っていましたが、質問は私が持っていたより "一般的な"問題にカプセル化されました。ありがとう – berthos

答えて

2

Application.Current.Windowsコレクションを使用してください。あなたのアプリのすべてのウィンドウのリストが含まれています。それらを繰り返し処理して操作することができます。この場合

、あなたが書くことができます。

public void MainWindow_Closing(object sender, CancelEventArgs e) 
{ 
    foreach (Window w in Application.Current.Windows) 
    { 
     if (w.Title == "Secondary Window") // <-- or whatever check you want to identify the secondary Window 
     { 
      w.Close(); 
      break; 
     } 
    } 
} 

これは、たとえば、あなただけの1、すべてのセカンダリウィンドウを閉じることができない、あなたは柔軟な動作を得ることができます。

+0

ウィンドウが閉じている間にウィンドウを閉じる/ msgstr "可視性を可視に設定したり、ウィンドウが閉じている間にShow、ShowDialog、Close、またはWindowInteropHelper.EnsureHandleを呼び出すことはできません。" – berthos

+0

@berthos私はこのようなエラーが発生しない...多分MainWindowの終了であなたはそのウィンドウ自体も閉じている。 –

1

メインウィンドウのWindow_Closingイベントから2番目のウィンドウのClose()関数を呼び出すことはできますか?

void MainWindow_Closing(object sender, CancelEventArgs e) 
{ 
    secondaryWindow.Close(); 

    ... 
} 
+0

はい、これはアイデアですが、もっと動的な方法を考えていましたが、これはforeach文のすべてのウィンドウを反復するとうまくいくかもしれません – berthos

1

Closingイベントハンドラ内のMainWindow以外のすべてのウィンドウを閉じます。これは動作するはずです:また、一箇所ですべてのウィンドウのクリーンアップを実行するためにApplication.Current.Exitイベントを処理するために検討する必要があります

void MainWindow_Closing(object sender, CancelEventArgs e) 
{ 
    foreach (Window w in Application.Current.Windows) 
    { 
     if (w != this) 
      w.Close(); 
    } 

    //handle clean up for MainWindow here... 
} 

関連する問題