2016-08-10 2 views
0

Ich habe eine Anwendung, die ein Hauptfenster hat die Anzahl der untergeordneten Fenster. Ich möchte in der Lage sein, die Sichtbarkeit der untergeordneten Fenster zu erhalten und sie zu speichern, wenn der Benutzer die Anwendung schließt.Holen Sie sich Windows-Sichtbarkeit bei App-Shutdown

Die Ereignisse habe ich versucht, sind die folgenden

Die Probleme ist, dass sie in der folgenden Reihenfolge aufgerufen werden

  1. ChildWindow.VisibleChanged
  2. ChildWindow.Closing
  3. ChildWindow.Closed
  4. MainWindow.Closing
  5. MainWindow.Closed
  6. Application.Exit

Also, wenn die Anwendung vorhanden ist oder das Hauptfenster schließt alle untergeordneten Fenster unsichtbar sind und es gibt Keine Möglichkeit für mich zu wissen, ob der Benutzer sie geöffnet hat oder nicht.

Gibt es ein anderes Ereignis, auf das ich hören sollte oder einen anderen Weg, es zu tun?

aktualisieren

Ich habe es geschafft, es in einem leeren WPF-Anwendung zu reproduzieren.

public partial class MainWindow : Window 
{ 
    Window dummyWindow = new Window(); 
    public MainWindow() 
    { 
     Application.Current.MainWindow = this; 
     InitializeComponent(); 
     this.Loaded += MainWindow_Loaded; 
     this.IsVisibleChanged +=(s,ev) => Debug.WriteLine("Main visiblity changed"); 
     this.Closing +=(s,ev) => Debug.WriteLine("Main closing"); 
     this.Closed +=(s,ev) => Debug.WriteLine("Main closed"); 
     Application.Current.Exit +=(s,ev) => Debug.WriteLine("App exit"); 
    } 

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 

     dummyWindow.Show(); 
     dummyWindow.Owner = this; 
     dummyWindow.IsVisibleChanged += (s,ev) => Debug.WriteLine("Dummy visiblity changed"); 
     dummyWindow.Closing += (s,ev) => Debug.WriteLine("Dummy closing"); 
     dummyWindow.Closed += (s,ev) => Debug.WriteLine("Dummy closed"); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Application.Current.Shutdown(); 
    } 
} 
+2

Ungerade, Kind-Fenster werden nicht unsichtbar, bevor Sie die Chance zu sagen, "Nein, nicht schließen Sie die App" so .. Schließen sollte früher sein. – BugFinder

Antwort

0

Scheinbar passiert dies, weil wenn eine Anwendung geschlossen wird, die Reihenfolge, in der WPF die Fenster schließt, diejenige ist, in der sie erstellt wurden, schließt sie nicht zuerst die MainWindow. Werfen Sie einen Blick auf die DoShutdown Methode.

Wenn mein Fall ist das erste Fenster ist die dummyWindow weil die initializer vor dem Konstruktor von MainWindow laufen was bedeutet, dass der Basiskonstruktor für dummyWindow zuerst genannt wird, die adds the window to the Application.WindowsInternal list.

Der einfachste Weg, um dies zu beheben, ist sicherzustellen, dass die Konstruktion eines anderen untergeordneten Fensters nach dem Bau der MainWindow erfolgt.

0

Sie müssen den Status des Programms speichern, wenn es geschlossen wird.

Sie können Ihr ViewModel serialisieren und auf der Festplatte speichern und beim nächsten Programmstart erneut laden.