Comment puis-je quitter une application WPF de façon programmatique?

au cours des quelques années où J'ai utilisé C# (Windows Forms), Je n'ai jamais utilisé WPF. Mais, maintenant, j'aime WPF, mais je ne sais pas comment je suis censé quitter mon application lorsque l'utilisateur clique sur l'élément de menu Exit dans le menu Fichier.

j'ai essayé:

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

parmi tant d'autres. Rien ne fonctionne.

386
demandé sur Peter Mortensen 2010-05-12 19:37:11

15 réponses

pour quitter votre application, vous pouvez appeler

System.Windows.Application.Current.Shutdown();

comme décrit dans la documentation de la méthode Application.Shutdown vous pouvez également modifier le comportement d'arrêt de votre application en spécifiant un ShutdownMode :

Shutdown est implicitement appelé par Windows Presentation Foundation (WPF) dans les situations suivantes:

  • quand Shutdowmode est défini à OnLastWindowClose.
  • quand le mode Shutdowmode est réglé sur OnMainWindowClose.
  • Lorsqu'un utilisateur termine une session et que l'événement de session est soit non manipulé, soit géré sans annulation.

veuillez noter que Application.Current.Shutdown(); ne peut être appelé que du thread qui a créé l'objet Application , c'est-à-dire normalement le thread principal.

641
répondu Dirk Vollmar 2017-07-05 14:43:21

Si vous vraiment besoin de fermer, vous pouvez aussi utiliser Environnement.Exit () , mais il n'est pas gracieux du tout (plus comme mettre fin au processus).

utilisez - le comme suit:

Environment.Exit(0)
125
répondu John 2018-05-19 19:29:56

comme wuminqi a dit , Application.Current.Shutdown(); est irréversible, et je crois qu'il est généralement utilisé pour forcer une application à fermer à des moments tels que quand un utilisateur se déconnecte ou ferme les fenêtres.

à la place, appelez this.close() dans votre fenêtre principale. Cela revient à appuyer sur Alt + F4 ou sur le bouton Fermer [x] de la fenêtre. Cela causera toutes les autres fenêtres de propriété à fermer et se terminera appeler Application.Current.Shutdown(); tant que l'action n'a pas été annulée. S'il vous plaît voir la documentation de MSDN sur fermeture d'une fenêtre .

aussi, parce que this.close() est annulable, vous pouvez mettre dans une boîte de dialogue Enregistrer les changements de confirmation dans le gestionnaire d'événements de clôture. Il suffit de faire un gestionnaire d'événements pour <Window Closing="..."> et de changer e.Cancel en conséquence. (Voir la "MSDN documentation pour plus de détails sur la façon de procéder.)

51
répondu Allen Pestaluky 2018-05-19 19:29:08

utiliser l'un des éléments suivants au besoin:

1.

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

2.

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

par-dessus tout les méthodes appelleront closing event de Window la classe et l'exécution peuvent s'arrêter à un moment donné (parce que les applications mettent habituellement des dialogues comme " êtes-vous sûr?' ou" voulez-vous enregistrer des données avant de fermer? ", avant qu'une fenêtre ne soit complètement fermée)

3. Mais si vous voulez mettre fin à l'application sans avertissement immédiatement. Utilisation en dessous de

   Environment.Exit(0);
24
répondu Kylo Ren 2016-05-08 05:56:40

Cela devrait faire l'affaire:

Application.Current.Shutdown();

si vous êtes intéressé, voici quelques documents supplémentaires que j'ai trouvé utiles:

détails sur la demande.Courant

Application WPF Cycle de vie

23
répondu Brian MacKay 2010-05-12 15:44:43

Voici comment je fais mienne:

// 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();
    }
}

je n'appelle que pour Application.Current.ShutDown() à partir de la fenêtre principale de l'application, toutes les autres fenêtres de this.Close() . Dans ma fenêtre principale, Window_Closing(...) gère le bouton x en haut à droite. Si l'une des méthodes appelle pour window closer, Window_Closing(...) saisit l'événement pour l'arrêter si l'utilisateur confirme.

la raison pour laquelle j'utilise en fait Application.Current.Shutdown() dans ma fenêtre principale est que j'ai remarqué que si une erreur de conception a été fait et je n'ai pas déclaré un parent de l'une de mes fenêtres dans une application, si cette fenêtre est ouverte sans être affichée avant la fermeture de la dernière fenêtre active, je me retrouve avec une fenêtre cachée courant à l'arrière-plan. L'application ne s'éteindra pas. Le seul moyen de prévenir la fuite de mémoire complète est pour moi d'aller dans le Gestionnaire des tâches pour arrêter l'application. Application.Current.Shutdown() me protège des défauts de conception involontaires.

C'est-à-dire de mon expérience personnelle. En fin de compte, utilisez ce qui est le mieux pour votre scénario. C'est juste un autre morceau de l'information.

16
répondu B.K. 2014-02-08 01:31:03

il ne devrait pas y avoir de message Application.ShutDown(); ou .Exit() .

Application est une classe statique. Il ne fait pas référence à la présente demande. Vous devez vous rendre à l'application actuelle et puis l'éteindre comme ceci:

Application.Current.Shutdown();
15
répondu TimothyP 2018-05-19 19:26:29

Essayer

App.Current.Shutdown();

pour moi

Application.Current.Shutdown(); 

n'a pas marché.

6
répondu Iwona Kubowicz 2015-03-25 12:56:39
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);
}
5
répondu Ravi 2014-02-25 17:01:34

selon mon interprétation, Application.Current.Shutdown() a aussi son inconvénient.

si vous voulez afficher une fenêtre de confirmation pour permettre aux utilisateurs de confirmer sur quit ou non, Application.Current.Shutdown() est irréversible.

5
répondu wuminqi 2018-05-19 19:26:56

une autre façon de faire:

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

cela va forcer tuer votre application dans le processus fonctionne toujours dans une application multi-threaded.

Note: il suffit de se soucier d'une application qui a enregistrer des données dans les fichiers à partir d'un autre thread.

4
répondu Ali Yousefie 2018-05-19 19:33:26

Caliburn micro aromatisé

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
répondu Anders 2015-08-04 07:55:27

à partir du code xaml vous pouvez appeler un SystemCommand prédéfini:

Command="SystemCommands.MinimizeWindowCommand"

je pense que ce devrait être la façon préférée...

-1
répondu Markus Sommerschnee 2018-06-16 09:42:15

nous pouvons utiliser la méthode this.Close() dans le fichier MainWindow.xaml.cs pour fermer la fenêtre.

ou utilisez la méthode App.Current.Shutdown() dans le fichier MainWindow.xaml.cs pour fermer la fenêtre.

-2
répondu Bhushan Shimpi 2018-05-19 19:31:46

très simple. Utilisez le code ci-dessous:

Application.Current.Shutdown();
-6
répondu Tijo Tom 2018-05-19 19:30:20