Laden...

Eigenschaften mehrerer Hauptfenster sichern

Erstellt von Master15 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.614 Views
M
Master15 Themenstarter:in
78 Beiträge seit 2007
vor 12 Jahren
Eigenschaften mehrerer Hauptfenster sichern

Hallo C#ler,

bisher hatte ich immer in den WPF-Anwendungen ein Hauptfenster. In der überschriebenen Methode OnClosing habe ich die relevanten Eigenschaften in den Settings gesichert, um u.a. die Fensterposition beim nächsten Start wiederherzustellen.

In einer anderen WPF-Anwendung erlaube ich dem Benutzer mehrere Hauptfenster zu öffnen.
Ist nur ein Fenster aktiv und man drückt X, Alt+F4 oder Datei->Beenden so ist das mit OnClosing kein Problem.

Bei mehreren geöffneten Hauptfenstern wäre es gut, wenn ein Dialog erscheint, was man machen möchte (Nur dieses Fenster schließen oder gesamte Anwendung beenden).
Möchte man die gesamte Anwendung beenden, so dachte ich, dass ich die OnExit-Methode in der App.xaml.cs überschreibe und darin die relevanten Werte aller Fenster sichere. Leider ist dort dann aber die Anzahl der Fenster schon 0:

Application.Current.Windows.OfType<MainWindow>()

OnClosing der einzelnen Windows bringt mir auch nichts, da die unabhängig voneinander sind.
Eine Idee ist es nach dem Aufrufen von X, Alt+F4 oder Datei->Beenden eine eigene Methode (z.B. Close) zum Beenden in der App.xaml.cs aufzurufen. Darin wird erstmal alles gesichert und erst danach erfolgt der Shutdown-Befehl.
Bei Datei->Beenden ist es kein großes Problem, dort dann aufzurufen:

((App)Application.Current).Close();

Das wird dann genau einmal aufgerufen. Danach kann dann alles beendet werden. OnClosing der einzelnen Fenster sind somit irrelevant.

Aber wie sieht es bei X und Alt+F4 aus? Gibt es da eine Möglichkeit das einfach abzufangen und einmal die Close-Methode aufzurufen?

Gruß
Thomas

16.841 Beiträge seit 2008
vor 12 Jahren

Hallo,

ich würde alle Hauptfenster in einem Singleton ablegen.
So kannst Du beim Closing die einzelnen Fenster (mit Namen oder Nummer) zum Speichern auswählen lassen.

Darauf kann dann Applikationsweit zugegriffen werden, zB auch in der OnExit-Methode, die dann die Fenster manuell schließt, wenn Du OnExit überschreibst.

M
Master15 Themenstarter:in
78 Beiträge seit 2007
vor 12 Jahren

Hallo,

das mit dem Singleton habe ich sogar schon für was anderes drin. 😉
Eine weitere Collection ist natürlich kein Problem, in der ich dann selber die geöffneten Hauptfenster verwalte.
Im MainWindow-Konstruktor könnte ich dann folgendes einbauen:

View.Instance.MainWindowList.Add(this);

In OnClosing oder OnClosed zudem:

View.Instance.MainWindowList.Remove(this);

Ich will jetzt nichts falsches sagen, aber ich glaube das kommt aufs gleiche hinaus, wie bei Application.Current.Windows. Wenn die OnExit-Methode in der App.xaml.cs aufgerufen wird, sind die einzelnen OnClosing der Hauptfenster bereits ausgeführt worden. Somit ist die MainWindowList wieder leer.

Hatte schon ein paar andere Versuche, bisher hat mir aber kein Ansatz gefallen. Ich will eigentlich nur, dass die Eigenschaften (Position, Fensterstatus,...) mehrerer Hauptfenster gespeichert werden, sodass beim Start wieder genau so viele Hauptfenster geöffnet werden (Multi-Head), wie der Benutzer zuletzt geöffnet hatte.

Das sollte auch unabhängig davon sein, was der Benutzer verwendet (X, Alt+F4, Datei->Beenden). Bei mehr als einem Hauptfenster würde ich noch gerne einen Dialog haben, damit man nur das Fenster oder die ganze Anwendung schließen kann:

//Ungetestet
if (View.Instance.MainWindowList.Count > 1)
{
    MessageBoxResult result = MessageBox.Show("Soll die gesamte Anwendung beendet werden?", "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);

    switch (result)
    {
        case MessageBoxResult.Yes: //Anwendung beenden
            Application.Current.Shutdown();
            break;
        case MessageBoxResult.No: //Nur dieses Fenster schließen
            this.Close();
            break;
        case MessageBoxResult.Cancel:
            Debug.WriteLine("Der Benutzer will doch nichts schließen");
            break;
    }
}
else 
{
    //Wenn nur dieses Fenster offen, einfach schließen. (ShutdownMode==OnLastWindowClose)
    this.Close();
}

Problem ist nur, wer das aufrufen soll. Bei Datei->Beenden kein Problem. Aber für X, Alt+F4 finde ich nur das Abfangen mit OnClosing. Das würde dann aber für jedes Fenster aufgerufen werden und nicht einmal.

Ich sehe momentan keine einfache Lösung.

Gruß
Thomas

M
Master15 Themenstarter:in
78 Beiträge seit 2007
vor 12 Jahren

Hallo,

hat wirklich niemand einen Tipp für mich ?(

Eventuell einfachere Frage:
Gibt es irgendeine Möglichkeit einmal eine Methode aufrufen zulassen, wenn der Benutzer X, Alt+F4, Datei->Beenden oder in Taskleiste "Fenster schließen" aufruft (abgesehen von Prozess beenden)?
ApplicationCommands.Exit wird leider auch meist nicht ausgelöst.

Gruß
Thomas