Wenn der Benutzer die Anwendung schließt, muss eine Save-File-Message angezeigt werden (um sicherzustellen, dass er die Änderungen der bearbeiteten Dateien verwerfen möchte).
Um dies zu implementieren, habe ich ein Menüelement mit einer Befehlsbindung (ohne Tastengeste):
%Vor%Das Hauptfenster hat ein Closing-Event. In diesem Fall überprüfe ich, ob dort nicht gespeicherte Dateien vorhanden sind. wenn ja, muss der gespeicherte Dialog geöffnet werden (um auszuwählen, welche Dateien gespeichert werden sollen):
%Vor%in dieser ShowDialog-Methode (implementiert in meiner SaveDialog-Klasse) rufe ich
auf %Vor%Das Problem ist:
Wenn ich die Alt + F4-Tastenkombination benutze, um die Anwendung zu schließen (Standardverhalten des Hauptfensters), funktioniert es und ich bekomme den gespeicherten Pfad, wenn es noch nicht gespeicherte Dateien gibt. aber wenn ich die Anwendung schließe, indem ich die Command_Exit-Methode, die Methode-Call
%Vor%gibt null zurück und das Dialogfeld wird nicht angezeigt.
Wenn ich die Alt + F4 KeyGesture der CommandBinding zuweisen, ist das Problem getauscht: Execut Command_Exit funktioniert gut, aber Alt + F4 Shortcut nicht.
Warum funktioniert die ShowDialog () - Methode nicht in beiden Fällen und wie behebt man sie?
Mit der Route Application.Current.Shutdown
können Sie auf die Anforderung zum Herunterfahren warten, indem Sie das Exit-Ereignis wie hier beschrieben behandeln:
Es ist nicht detailliert, wie es Fenster schließt, also würde ich nicht unbedingt davon überzeugt sein, dass der schließende Ereignishandler ausgelöst würde, bevor es die Anwendung schließt.
Der andere sehr übliche Weg, um die Anwendung herunterzufahren, besteht darin, das Hauptfenster zu schließen (das am Anfang gezeigte). Dies wäre wahrscheinlich die Methode Window.Close
. Wenn Sie sich bereits im Kontext des Fensters befinden, rufen Sie einfach Close()
auf. Dies wird dann den Closing Event Handler treffen.
Ihre Command_Exit
Implementierung ist falsch. Application.Current.Shutdown()
bedeutet, dass die Anwendung bereits heruntergefahren ist, wodurch verhindert werden kann, dass die Dialoge geöffnet werden.
Sie sollten den Befehl auf andere Weise implementieren: Im Befehl sollten Sie Ihre Geschäftslogik fragen, ob das Herunterfahren sicher ist, und in diesem Fall Application.Current.Shutdown()
nur ausgeben. Andernfalls sollten Sie die Geschäftslogik bitten, die Shutdown-Sequenz zu starten, die wiederum die geöffneten Dateien speichert und nach Abschluss der Sicherungsoperationen ein Shutdown
ausgibt.
Darüber hinaus sollten Sie die gleiche Routine auslösen, wenn der Benutzer versucht, das Hauptfenster zu schließen (dh auf seinem Window.Closing
).