it-swarm.com.de

Wie beende ich eine WPF-Anwendung programmgesteuert?

In den wenigen Jahren, in denen ich C # (Windows Forms) verwendet habe, habe ich noch nie WPF verwendet. Aber jetzt liebe ich WPF, aber ich weiß nicht, wie ich meine Anwendung beenden soll, wenn der Benutzer im Menü Datei auf den Menüpunkt Beenden klickt.

Ich habe versucht:

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

Unter vielen anderen. Nichts funktioniert.

442
anon271334

Um Ihre Anwendung zu beenden, können Sie anrufen

_System.Windows.Application.Current.Shutdown();
_

Wie in der Dokumentation zur Application.Shutdown -Methode beschrieben, können Sie auch das Verhalten beim Herunterfahren Ihrer Anwendung ändern, indem Sie ein ShutdownMode angeben:

Das Herunterfahren wird implizit von Windows Presentation Foundation (WPF) in den folgenden Situationen aufgerufen:

  • Wenn ShutdownMode auf OnLastWindowClose festgelegt ist.
  • Wenn der ShutdownMode auf OnMainWindowClose gesetzt ist.
  • Wenn ein Benutzer eine Sitzung beendet und das SessionEnding-Ereignis nicht behandelt oder ohne Abbruch behandelt wird.

Beachten Sie auch, dass Application.Current.Shutdown(); möglicherweise nur von dem Thread aufgerufen wird, der das Application -Objekt erstellt hat, d. H. Normalerweise vom Hauptthread.

723
Dirk Vollmar

Wenn Sie wirklich brauchen, um es zu schließen, können Sie auch Environment.Exit () verwenden, aber es ist überhaupt nicht anmutig (Eher wie das Beenden des Prozesses).

Verwenden Sie es wie folgt:

Environment.Exit(0)
144
John

Wie Wuminqi sagte , Application.Current.Shutdown(); ist irreversibel, und ich glaube, es wird in der Regel verwendet, um eine Anwendung zum Schließen zu zwingen, wenn ein Benutzer sich abmeldet oder Windows herunterfährt.

Rufen Sie stattdessen this.close() in Ihrem Hauptfenster auf. Dies entspricht dem Drücken von Alt + F4 oder die Schaltfläche zum Schließen [x] im Fenster. Dies führt dazu, dass alle anderen Fenster geschlossen werden und am Ende Application.Current.Shutdown(); aufgerufen wird, solange die Schließaktion nicht abgebrochen wurde. Weitere Informationen finden Sie in der MSDN-Dokumentation unter Schließen eines Fensters .

Da this.close() storniert werden kann, können Sie im schließenden Ereignishandler einen Bestätigungsdialog für Änderungen einfügen. Erstellen Sie einfach einen Event-Handler für <Window Closing="..."> und ändern Sie e.Cancel entsprechend. (Weitere Informationen hierzu finden Sie in der MSDN-Dokumentation .)

59
Allen Pestaluky

Verwenden Sie nach Bedarf eine der folgenden Optionen:

1.

_ App.Current.Shutdown();
OR
 Application.Current.Shutdown();
_

2.

_ App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();
_

Vor allem Methoden rufen closing event der Klasse Window auf, und die Ausführung kann an einem bestimmten Punkt angehalten werden (was normalerweise dazu führt, dass Anwendungen Dialoge platzieren) wie 'bist du sicher?' oder ' Möchten Sie die Daten vor dem Schließen speichern? ', bevor ein Fenster vollständig geschlossen wird)

3. Aber wenn Sie die Anwendung ohne Vorwarnung sofort beenden möchten. Verwenden Sie unten

_   Environment.Exit(0);
_
33
Kylo Ren

Dies sollte den Trick machen:

Application.Current.Shutdown();

Wenn Sie interessiert sind, finden Sie hier zusätzliches Material, das ich hilfreich fand:

Details zur Bewerbung.Aktuell

WPF Application LifeCycle

24
Brian MacKay

So mache ich meins:

// 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 rufe Application.Current.ShutDown() nur im Hauptanwendungsfenster auf, alle anderen Fenster verwenden this.Close(). In meinem Hauptfenster behandelt Window_Closing(...) die Schaltfläche x oben rechts. Wenn eine der Methoden das Schließen des Fensters erfordert, erfasst Window_Closing(...) das Ereignis zum Herunterfahren, wenn der Benutzer dies bestätigt.

Der Grund, warum ich Application.Current.Shutdown() in meinem Hauptfenster verwende, besteht darin, dass ich festgestellt habe, dass ein Konstruktionsfehler vorliegt und ich in einer Anwendung kein übergeordnetes Element eines meiner Fenster deklariert habe, wenn dies der Fall ist Wird geöffnet, ohne dass es vor dem letzten aktiven Schließen des Fensters angezeigt wird. Ich habe ein verstecktes Fenster im Hintergrund. Die Anwendung wird nicht beendet. Die einzige Möglichkeit, einen vollständigen Speicherverlust zu verhindern, besteht darin, in den Task-Manager zu wechseln , um die Anwendung zu beenden. Application.Current.Shutdown() schützt mich vor unbeabsichtigten Designfehlern.

Das ist aus meiner persönlichen Erfahrung. Verwenden Sie am Ende das Beste für Ihr Szenario. Dies ist nur eine weitere Information.

18
B.K.

Es sollte keine Meldung Application.ShutDown(); oder .Exit() vorhanden sein.

Application ist eine statische Klasse. Es bezieht sich nicht auf die aktuelle Anwendung. Sie müssen zu der aktuellen Anwendung gelangen und diese dann wie folgt beenden:

Application.Current.Shutdown();
16
TimothyP

Eine andere Möglichkeit, dies zu tun:

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

Dadurch wird die Anwendung zwangsweise beendet. Es funktioniert immer, auch in einer Multithread-Anwendung.

Hinweis: Achten Sie nur darauf, nicht gespeicherte Daten in einem anderen Thread nicht zu verlieren.

6
Ali Yousefi

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

Wenn Sie ein Bestätigungsfenster anzeigen möchten, in dem Benutzer das Beenden bestätigen können, ist Application.Current.Shutdown() irreversibel.

6
wuminqi

Versuchen

App.Current.Shutdown();

Für mich

Application.Current.Shutdown(); 

hat nicht funktioniert.

6
Iwona Kubowicz
private void _MenuExit_Click(object sender, RoutedEventArgs e)
{
   System.Windows.Application.Current.MainWindow.Close();
}

//Override the onClose method in the Application Main window

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    MessageBoxResult result =   MessageBox.Show("Do you really want to close", "",
                                          MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.Cancel)
    {
       e.Cancel = true;
    }
    base.OnClosing(e);
}
6
Ravi

Caliburn mit Mikrogeschmack

public class CloseAppResult : CancelResult
{
    public override void Execute(CoroutineExecutionContext context)
    {
        Application.Current.Shutdown();
        base.Execute(context);
    }
}

public class CancelResult : Result
{
    public override void Execute(CoroutineExecutionContext context)
    {
        OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
    }
}
2
Anders