2017-07-05 6 views
0

Ich habe 2 Fenster in einer WPF-Anwendung, und wenn ich die Main schließen, möchte ich auch die andere schließen.WPF schließen sekundäres Fenster vor dem Hauptfenster

ich erreicht dies, indem in meiner App.xaml Einstellung:

ShutdownMode="OnMainWindowClose" 

Die 2 Fenster haben eine Window_Closing Ereignis, in dem ich einige Komponenten de-initialisieren. Nun, was ich erreichen möchte, ist: Wenn ich das MainWindow schließe, muss das Window_Closing Ereignis des zweiten Fensters vor dem schließenden Ereignis des Hauptfensters ausgeführt werden, weil das De-Init des zweiten vor dem ersten ausgeführt werden muss. Irgendeine Idee, wie kann ich das erreichen?

+0

Ich habe das Tag "MVVM" entfernt. Diese Frage hat damit nichts zu tun, es geht nur um das Verhalten von UI-Elementen (in diesem Fall die Fenster von WPF). Die Trennung der App in verschiedenen Schichten oder das Vorhandensein von ViewModels spielt hier keine Rolle. –

+0

Ja, Sie haben Recht, ich folgte dem MVVM-Muster, aber die Frage wurde zu einem "generischen" Problem gekapselt, das ich hatte. Danke – berthos

Antwort

2

Verwenden Sie die Application.Current.Windows Sammlung. Es enthält die Liste aller Fenster Ihrer App. Sie können sie durchlaufen und an ihnen arbeiten.

In diesem Fall können Sie schreiben:

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; 
     } 
    } 
} 

Dies ermöglicht Ihnen ein flexibles Verhalten zu gewinnen, zum Beispiel können Sie alle sekundären Fenster schließen ein, nicht nur.

+0

sieht es aus wie kann ich Sichtbarkeit von Fenstern nicht schließen/ändern, während Fenster schließt: Msgstr "Kann Sichtbarkeit für Sichtbar nicht festlegen oder Show, ShowDialog, Close oder WindowInteropHelper.EnsureHandle aufrufen, während ein Fenster geschlossen wird." – berthos

+0

@berthos Ich erhalte keinen solchen Fehler ... vielleicht schließen Sie auch das Fenster selbst, wenn Sie das MainWindow schließen. –

1

Können Sie einfach die Close() - Funktion des zweiten Fensters vom Hauptfenster Window_Closing-Ereignis aufrufen?

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

    ... 
} 
+0

Ja, das ist eine Idee, aber ich dachte für eine dynamischere Art, dies könnte auch funktionieren, wenn ich alle diese Fenster in einer Foreach-Anweisung iterieren – berthos

1

Schließen Sie alle Fenster außer dem MainWindow im Closing Event-Handler. Dies sollte funktionieren:

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... 
} 

Sie können auch das Application.Current.Exit Ereignis zu behandeln zu prüfen, die Bereinigung aller Fenster an einem Ort durchzuführen.

Verwandte Themen