2012-04-12 12 views
8

Wenn der Benutzer die Anwendung schließt, muss eine Save-File-Message angezeigt werden (um sicher zu sein, dass er die Änderungen der bearbeiteten Dateien verwerfen möchte).ShowDialog in Closing-Event

dies zu implementieren, ich habe ein menuitem mit einer Befehlsbindung (ohne Schlüssel-Geste):

private void Command_Exit(object sender, ExecutedRoutedEventArgs e) 
{ 
    Application.Current.Shutdown(); 
} 

das Hauptfenster ein Schließereignis hat. In diesem Fall überprüfe ich, ob dort nicht gespeicherte Dateien vorhanden sind. wenn ja, der Savedialog geöffnet werden muss (wählen, die Dateien gespeichert werden):

private void Window_Closing(object sender, CancelEventArgs e) 
    { 
     if (sdl.Count() > 0) 
     { 
      SaveDialog sd = new SaveDialog(); 
      IEnumerable<Doc> close = sd.ShowDialog(this); 
      if (close == null) 
       e.Cancel = true; 
      else 
       foreach (Doc document in close) 
        document.Save(); 
     } 

    } 

in dieser Showdialog-Methode (implementiert in meiner Savedialog-Klasse) i nennen

bool? ret = ShowDialog(); 
if (!ret.HasValue) 
    return null; 
if (!ret.Value) 
    return null; 

Das Problem ist:

Wenn ich die Alt + F4-Verknüpfung verwende, um die Anwendung zu schließen (Standard-Verhalten des Hauptfensters) funktioniert es und ich bekomme den gespeicherten, wenn es nicht gespeicherte Dateien gibt. aber wenn ich die Anwendung zu schließen, indem die Command_Exit-Methode ausgeführt wird, die Methode-Aufruf

bool? ret = ShowDialog(); 

kehrt null und der Dialog wird nicht angezeigt.

Wenn ich die Alt + F4 KeyGesture der CommandBinding zuweisen, wird das Problem umgeschaltet: Ausführen von Command_Exit funktioniert gut, aber Alt + F4 Shortcut nicht.

Warum funktioniert die ShowDialog() - Methode nicht in beiden Fällen und wie kann man sie beheben?

+0

Wie kann ein Fenster geschlossen werden? Nicht nur interaktiv. – Jodrell

Antwort

6

Die Application.Current.Shutdown Route ermöglicht es Ihnen, durch die Handhabung des Exit-Ereignis für das Herunterfahren Anfrage zu hören, wie hier beschrieben:

http://msdn.microsoft.com/en-us/library/ms597013.aspx

Es ist nicht genau, wie es Fenster schließt, so würde ich nicht unbedingt sein überzeugt, dass der schließende Event-Handler ausgelöst würde, bevor die Anwendung geschlossen wird.

Die andere sehr standardmäßige Möglichkeit, die Anwendung herunterzufahren, besteht darin, das Hauptfenster zu schließen (das am Anfang gezeigte). Dies wäre wahrscheinlich die Window.Close Methode, wenn Sie bereits im Kontext des Fensters sind, rufen Sie einfach Close(). Dies wird dann den Closing Event Handler treffen.

+0

aah, natürlich, warum habe ich nicht gedacht, einfach anrufen Close()? Danke, Problem gelöst – 0xDEADBEEF

+0

Schließen ist der Standard Weg.Wenn das Hauptformular geschlossen wird, wird der Code natürlich zum Einstiegspunkt weitergeleitet, an dem er beendet wird. Die WPF-Innenfunktionen werden dann alle verbleibenden Teile der App herunterfahren. –

3

Ihre Command_Exit Implementierung ist falsch. Application.Current.Shutdown() bedeutet, dass die Anwendung bereits heruntergefahren wird, wodurch das Öffnen der Dialoge verhindert werden kann.

Sie sollten den Befehl auf andere Weise implementieren: In dem Befehl sollten Sie Ihre Geschäftslogik fragen, ob das Herunterfahren sicher ist, und geben Sie in diesem Fall nur aus. Andernfalls sollten Sie die Geschäftslogik bitten, die Abschaltsequenz zu starten, die wiederum die geöffneten Dateien speichert und nach Abschluss der Sicherungsoperationen eine Shutdown ausgibt.

Darüber hinaus sollten Sie die gleiche Routine auslösen, wenn der Benutzer versucht, das Hauptfenster zu schließen (das heißt, auf seinem Window.Closing).

Verwandte Themen