555 Stimmen

Wie kann ich eine WPF-Anwendung programmgesteuert beenden?

Wie soll man eine Anwendung beenden, wenn der Benutzer z. B. auf den Menüpunkt Beenden im Menü Datei klickt?

Ich habe es versucht:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

Neben vielen anderen. Nichts funktioniert.

20voto

B.K. Punkte 9716

So mache ich es bei mir:

// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
                                   MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
    if (response == MessageBoxResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        Application.Current.Shutdown();
    }
}

Ich fordere nur Application.Current.ShutDown() aus dem Hauptanwendungsfenster, alle anderen Fenster verwenden this.Close() . In meinem Hauptfenster, Window_Closing(...) bedient die rechte obere Ecke x Taste. Wenn eine der Methoden zum Schließen des Fensters aufruft, Window_Closing(...) fasst das Ereignis zum Herunterfahren, wenn der Benutzer dies bestätigt.

Der Grund, warum ich in der Tat Application.Current.Shutdown() in meinem Hauptfenster ist, dass ich festgestellt habe, dass, wenn ein Design-Fehler gemacht wurde und ich kein übergeordnetes Fenster in einer Anwendung deklariert habe, wenn dieses Fenster geöffnet wird, ohne dass es vor dem Schließen des letzten aktiven Fensters angezeigt wird, ich mit einem versteckten Fenster im Hintergrund dastehe. Die Anwendung wird nicht beendet. Die einzige Möglichkeit, ein vollständiges Speicherleck zu verhindern, besteht darin, dass ich in der Aufgaben-Manager um die Anwendung zu beenden. Application.Current.Shutdown() schützt mich vor unbeabsichtigten Konstruktionsfehlern.

Das ist meine persönliche Erfahrung. Letztendlich müssen Sie das verwenden, was für Ihr Szenario am besten geeignet ist. Dies ist nur ein weiteres Stück Information.

17voto

TimothyP Punkte 19922

Es sollte keine Application.ShutDown(); o .Exit() Nachricht.

Application ist eine statische Klasse. Sie bezieht sich nicht auf die aktuelle Anwendung. Sie müssen die aktuelle Anwendung aufrufen und sie dann wie folgt beenden:

Application.Current.Shutdown();

15voto

burgund Punkte 181

Zusammenfassend lässt sich sagen, dass es einige Möglichkeiten gibt, dies zu tun.

1) Beenden des Prozesses, der die Finalisierung, Fehlerbehandlung usw. überspringt:

Process.GetCurrentProcess().Kill();

2) Beenden der aktuellen Anwendung, was wahrscheinlich der richtige Weg ist, da er die Exit-Ereignisse aufruft:

Application.Current.Shutdown();

oder

this.Shutdown();

(wenn sie in einer Instanz der App-Klasse aufgerufen werden)

3) Schließen der aktuellen Anwendung (alle Formulare müssen vorher geschlossen/beendet werden):

this.Close(); 

(bei Aufruf in einer Instanz der App-Klasse)

4) Beenden der Umgebung, wodurch die Anwendung beendet wird:

Environment.Exit(0);

Vielleicht möchten Sie auch etwas über Exit-Status lesen aquí

12voto

Ali Yousefi Punkte 2225

Sie können dies auch auf andere Weise tun:

System.Diagnostics.Process.GetCurrentProcess().Kill();

Dadurch wird Ihre Anwendung zwangsweise beendet. Es funktioniert immer, auch bei einer Multithreading-Anwendung.

Hinweis: Achten Sie nur darauf, dass nicht gespeicherte Daten in einem anderen Thread nicht verloren gehen.

7voto

wuminqi Punkte 339

Nach meinem Verständnis, Application.Current.Shutdown() hat auch seinen Nachteil.

Wenn Sie ein Bestätigungsfenster anzeigen möchten, damit die Benutzer das Beenden bestätigen können oder nicht, Application.Current.Shutdown() ist unumkehrbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X