562 votes

Comment quitter une application WPF de manière programmatique ?

Depuis quelques années que j'utilise C# (WinForms), je n'ai jamais utilisé WPF. Mais maintenant, j'adore WPF, mais je ne sais pas comment je suis censé quitter mon application lorsque l'utilisateur clique sur l'élément Exit du menu File.

J'ai essayé :

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

Parmi beaucoup d'autres. Rien ne fonctionne.

895voto

0xA3 Points 73439

Pour quitter votre application, vous pouvez appeler

Application.Current.Shutdown();

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

L'arrêt est implicitement appelé par Windows Presentation Foundation (WPF) dans les situations suivantes :

  • Lorsque ShutdownMode est défini sur OnLastWindowClose.
  • Lorsque le ShutdownMode est défini sur OnMainWindowClose.
  • Lorsqu'un utilisateur met fin à une session et que l'événement SessionEnding n'est pas traité ou est traité sans annulation.

Veuillez également noter que Application.Current.Shutdown(); ne peut être appelé qu'à partir du thread qui a créé l'élément Application c'est-à-dire normalement le thread principal.

9 votes

Comme je l'ai souligné, ce n'est pas bizarre. Dans WPF, Application est une classe statique. Application.Current est une référence à votre application en cours d'exécution.

4 votes

À mon avis, il est un peu bizarre dans le sens où ce n'est pas évident au premier coup d'œil, et il s'écarte juste assez des modèles précédents pour déconcerter les gens. Le fait que cela fonctionne est parfaitement logique, bien sûr.

0 votes

Pour faire simple : si votre dernière fenêtre est fermée avec... this.Close() ...L'application sera arrêtée, à condition que vous n'ayez pas changé le ShutdownMode.

192voto

John Points 1484

Si vous avez VRAIMENT besoin qu'il ferme, vous pouvez aussi utiliser Environment.Exit() mais ce n'est pas du tout gracieux (cela revient plutôt à mettre fin au processus).

Utilisez comme suit :

Environment.Exit(0)

5 votes

Environment.Exit() nécessite au moins un paramètre, un code de sortie. Utilisez Environment.Exit(0) si vous n'êtes pas concerné par le code de sortie.

32 votes

Cette méthode a en fait tout fermé. Mon application laissait quelque chose en cours d'exécution (le formulaire était fermé, mais un processus était toujours en cours d'exécution) avec la méthode Application.Current.Shutdown();

5 votes

Environment.Exit est certainement le bon moyen de garantir l'arrêt d'une application. Avec Application.Current.Shutdown, vous pouvez facilement vous retrouver avec une application fonctionnant indéfiniment si vous avez du code qui se repousse dans le répartiteur.

83voto

Allen Pestaluky Points 176

Comme l'a dit wuminqi, Application.Current.Shutdown(); est irréversible et je crois qu'il est généralement utilisé pour forcer une application à se fermer à des moments tels que la fermeture de session ou l'arrêt de Windows par l'utilisateur. Au lieu de cela, appelez this.close() dans votre fenêtre principale. Cela revient à appuyer sur "ALT-F4" ou sur le bouton de fermeture [x] de la fenêtre. Cette opération entraînera la fermeture de toutes les autres fenêtres en votre possession et se soldera par l'appel suivant Application.Current.Shutdown(); tant que l'action de fermeture n'a pas été annulée. Veuillez consulter la documentation MSDN sur Fermeture d'une fenêtre .

Aussi, parce que this.close() est annulable, vous pouvez insérer une boîte de dialogue de confirmation des modifications enregistrées dans le gestionnaire d'événements de fermeture. Il suffit de créer un gestionnaire d'événement pour <Window Closing="..."> et le changement e.Cancel en conséquence. (Voir le Document MSDN pour plus de détails sur la façon de procéder)

3 votes

+1 J'ai décidé d'opter pour celle-ci, d'autant plus que j'ai besoin de sauvegarder les fichiers ouverts avant de quitter réellement l'application.

4 votes

Il est important de noter qu'Allen a souligné un fait très important : tous les autres Windows possédés seront fermés. Vous devez vous assurer que vous déclarez la propriété. Si vous avez une fenêtre en cours d'exécution et que vous ouvrez une autre fenêtre sans la montrer, après avoir fermé la fenêtre active, la fenêtre cachée forcera l'application à continuer de fonctionner. Vous aurez une fuite de mémoire potentielle à moins que vous ne fermiez cette fenêtre par d'autres moyens (gestionnaire de tâches, etc.). Je l'ai testé.

0 votes

@B.K. Dans ce cas, l'utilisation de Application.Current.Shutdown() au lieu de this.close() fermera-t-elle également les fenêtres cachées ?

29voto

Brian MacKay Points 10483

Cela devrait faire l'affaire :

Application.Current.Shutdown();

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

Détails sur Application.Current

Cycle de vie des applications WPF

20voto

B.K. Points 2193

Voici comment je fais le mien :

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

J'appelle seulement pour Application.Current.ShutDown() à partir de la fenêtre principale de l'application, toutes les autres fenêtres utilisent la fonction this.Close() . Dans ma fenêtre principale, Window_Closing(...) manipule en haut à droite x bouton. Si l'une des méthodes appelle le rapprochement de la fenêtre, Window_Closing(...) saisit l'événement pour l'arrêt 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é commise et que je n'ai pas déclaré le parent d'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 fonctionnant en arrière-plan. L'application ne se fermera pas. La seule façon d'éviter une fuite de mémoire complète est d'aller dans le fichier Gestionnaire des tâches pour fermer l'application. Application.Current.Shutdown() me protège des défauts de conception involontaires.

C'est mon expérience personnelle. En fin de compte, utilisez ce qui est le mieux pour votre scénario. Ce n'est qu'un élément d'information supplémentaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X