Comment puis-je quitter une application WPF par programmation?

Dans les 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 Quitter dans le menu Fichier.

J’ai essayé:

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

Parmi beaucoup d’autres. Rien ne fonctionne.

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 :

L’arrêt est appelé implicitement 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 termine une session et que l’événement SessionEnding est non géré ou traité sans annulation.

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

Si vous en avez vraiment besoin pour fermer, vous pouvez également utiliser Environment.Exit () , mais ce n’est pas du tout gracieux (plus proche de la fin du processus).

Utilisez-le comme suit:

 Environment.Exit(0) 

Comme le disait wuminqi , Application.Current.Shutdown(); est irréversible, et je pense qu’il est généralement utilisé pour forcer une application à se fermer à des moments tels que lorsqu’un utilisateur se déconnecte ou ferme Windows.

Au lieu de cela, 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 provoquera la fermeture de toutes les autres fenêtres possédées et finira par appeler Application.Current.Shutdown(); tant que l’action de clôture n’a pas été annulée. Veuillez consulter la documentation MSDN sur la fermeture d’une fenêtre .

En outre, parce que this.close() est this.close() vous pouvez insérer une boîte de dialog de confirmation des modifications de sauvegarde dans le gestionnaire d’événements de fermeture. Créez simplement un gestionnaire d’événement pour et modifiez e.Cancel conséquence. (Voir la documentation MSDN pour plus de détails sur la façon de procéder.)

Utilisez 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(); 

Au-dessus de toutes les méthodes, on appellera closing event de closing event de la classe Window et l’exécution peut s’arrêter à un moment donné (parce que les applications placent des dialogs comme “êtes-vous sûr?” Ou ” Voulez-vous sauvegarder les données avant la fermeture? )

3. Mais si vous souhaitez mettre fin à l’application sans aucun avertissement immédiatement. Utiliser ci-dessous

  Environment.Exit(0); 

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

WPF Application LifeCycle

Voici comment je fais le mien:

 // Any control that causes the Window.Closing even to sortinggger. 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() depuis la fenêtre principale de l’application, toutes les autres fenêtres utilisent this.Close() . Dans ma fenêtre principale, Window_Closing(...) gère le bouton x haut à droite. Si l’une des méthodes appelle un rapprochement de fenêtre, Window_Closing(...) récupère l’événement pour le fermer si l’utilisateur confirme.

La raison pour laquelle j’utilise Application.Current.Shutdown() dans ma fenêtre principale est que j’ai remarqué que si une erreur de conception était commise et que je n’avais pas déclaré un parent de l’une de mes fenêtres dans une application, si fenêtre est ouverte sans être affiché avant la dernière fermeture de la fenêtre active, je rest avec une fenêtre cachée en cours d’exécution en arrière-plan. L’application ne s’arrêtera pas. Le seul moyen d’empêcher une fuite de mémoire complète est que j’entre dans le Gestionnaire des tâches pour arrêter l’application. Application.Current.Shutdown() me protège des défauts de conception non intentionnels.

C’est de mon expérience personnelle. En fin de compte, utilisez ce qui est le mieux pour votre scénario. Ceci est juste une autre information.

Il ne devrait pas y avoir d’ Application.ShutDown(); ou .Exit() message.

Application est une classe statique. Il ne fait pas référence à l’application en cours. Vous devez accéder à l’application en cours, puis la fermer comme ceci:

 Application.Current.Shutdown(); 

Essayer

 App.Current.Shutdown(); 

Pour moi

 Application.Current.Shutdown(); 

n’a pas fonctionné.

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

Selon ma compréhension, Application.Current.Shutdown() également son inconvénient.

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

Une autre façon de faire cela:

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

Cela va forcer à tuer votre application en cours de traitement fonctionne toujours dans une application multithread.

Remarque: prenez juste soin d’une application qui a enregistré des données dans des fichiers d’un autre thread.

Calibrer 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 }); } } 

A partir du code xaml, vous pouvez appeler une SystemCommand prédéfinie:

 Command="SystemCommands.MinimizeWindowCommand" 

Je pense que cela devrait être la manière préférée …

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.

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

 Application.Current.Shutdown();