Depuis quelques années que j'utilise 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 ShutdownMode est défini sur OnMainWindowClose.
- Lorsqu'un utilisateur termine une session et que l'événement SessionEnding est non géré ou géré sans annulation.
Veuillez également noter que Application.Current.Shutdown();
ne peut être appelé qu'à partir du thread qui a créé l'objet Application
, c'est-à-dire normalement le thread principal.
Si vous en avez vraiment besoin , vous pouvez aussi utiliser Environment.Exit () , mais ce n'est pas du tout gracieux (plutôt comme mettre fin au processus).
Utilisez-le comme suit:
Environment.Exit(0)
Comme wuminqi a dit , Application.Current.Shutdown();
est irréversible, et je pense qu'il est généralement utilisé pour forcer une application à se fermer par exemple lorsqu'un utilisateur se déconnecte ou ferme Windows.
Appelez plutôt this.close()
dans la fenêtre principale. C’est pareil que presser Alt + F4 ou le bouton fermer [x] sur la fenêtre. Cela entraînera la fermeture de toutes les autres fenêtres possédées et appellera finalement Application.Current.Shutdown();
tant que l'action de fermeture n'aura pas été annulée. Veuillez consulter la documentation MSDN sur Fermeture d’une fenêtre .
De plus, étant donné que this.close()
est annulable, vous pouvez insérer une boîte de dialogue de confirmation de l'enregistrement des modifications dans le gestionnaire d'événements de clôture. Créez simplement un gestionnaire d’événements pour <Window Closing="...">
et changez e.Cancel
en conséquence. (Voir documentation MSDN pour plus de détails sur la procédure à suivre.)
Utilisez l'un des éléments suivants selon vos besoins:
1.
_ App.Current.Shutdown();
OR
Application.Current.Shutdown();
_
2.
_ App.Current.MainWindow.Close();
OR
Application.Current.MainWindow.Close();
_
Toutes les méthodes vont appeler closing event
de Window
la classe et l'exécution peuvent s'arrêter à un moment donné (car les applications mettent généralement des dialogues comme 'êtes-vous sûr?' ou ' Voulez-vous sauvegarder les données avant de fermer? ', avant qu'une fenêtre ne soit complètement fermée)
. Mais si vous voulez mettre fin à l'application sans aucun avertissement immédiatement. Utilisez ci-dessous
_Environment.Exit(0);
_
Cela devrait faire l'affaire:
Application.Current.Shutdown();
Si cela vous intéresse, voici quelques éléments supplémentaires que j'ai trouvés utiles:
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 uniquement pour Application.Current.ShutDown()
à partir de 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
en haut à droite. Si l’une des méthodes appelle un rapprochement de fenêtre, Window_Closing(...)
saisit l’événement pour l’arrêter si l’utilisateur confirme.
La raison pour laquelle j’utilise effectivement 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’ai pas déclaré le parent de l’une de mes fenêtres dans une application, si cette fenêtre est ouvert sans être affiché avant la dernière fermeture de la fenêtre active, il me reste une fenêtre cachée en arrière-plan. L'application ne sera pas fermée. Le seul moyen d'éviter une fuite totale de mémoire consiste pour moi à entrer dans le Gestionnaire de tâches pour arrêter l'application. Application.Current.Shutdown()
me protège contre les défauts de conception involontaires.
C'est de mon expérience personnelle. Au final, utilisez ce qui convient le mieux à votre scénario. Ceci est juste un autre élément d'information.
Il ne devrait pas y avoir de message Application.ShutDown();
ni .Exit()
.
Application
est une classe statique. Il ne fait pas référence à l'application actuelle. Vous devez accéder à l'application actuelle, puis la fermer de la manière suivante:
Application.Current.Shutdown();
Une autre façon de faire ceci:
System.Diagnostics.Process.GetCurrentProcess().Kill();
Cela forcera tuer votre application. Cela fonctionne toujours, même dans une application multithread.
Remarque: Veillez simplement à ne pas perdre de données non sauvegardées dans un autre thread.
Selon ma compréhension, Application.Current.Shutdown()
présente également un inconvénient.
Si vous souhaitez afficher une fenêtre de confirmation permettant aux utilisateurs de confirmer la fermeture ou non, Application.Current.Shutdown()
est irréversible.
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);
}
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 });
}
}