Comment quitter une application WPF par programme?

478

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.

Peter Mortensen
la source

Réponses:

781

Pour quitter votre application, vous pouvez appeler

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

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

L'arrêt est implicitement appelé 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 met fin à une session et que l'événement SessionEnding est soit non géré, soit géré sans annulation.

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

Dirk Vollmar
la source
8
Comme je l'ai souligné, ce n'est pas bizarre. Dans WPF, l'application est une classe statique. Application.Current est une référence à votre application en cours d'exécution.
TimothyP
4
À mon avis, c'est un peu bizarre dans le sens où ce n'est pas évident à première vue, et il dévie juste assez des modèles précédents pour déconcerter les gens. Il est parfaitement logique que cela fonctionne bien sûr.
Brian MacKay
20
Si vous appelez, Application.Current.Shutdown();votre fonction ne reviendra pas immédiatement. Vous devez également appeler return;pour cela.
Erwin Mayer
2
J'ai utilisé ceci à partir du moment où une fenêtre ouvre une autre fenêtre et, dans l'événement window_closed de cette fenêtre, j'ai ajouté ce code. toutes les fenêtres disparaissent, mais le programme fonctionne toujours au-delà de l'endroit où la fenêtre contextuelle est créée.
diyoda_
7
@TimothyP Non Applicationn'est PAS une classe statique. Avoir un Application.Currentmembre statique ne signifie pas qu'il est statique. Au lieu de cela, c'est une classe normale qui peut être dérivée.
Earth Engine
156

Si vous en avez vraiment besoin pour fermer, vous pouvez également utiliser Environment.Exit () , mais ce n'est pas du tout gracieux (plus comme mettre fin au processus).

Utilisez-le comme suit:

Environment.Exit(0)
John
la source
4
Environment.Exit()a besoin d'au moins un paramètre, un code de sortie. À utiliser Environment.Exit(0)si vous n'êtes pas préoccupé par le code de sortie.
gbmhunter
24
Cette méthode a en fait tout fermé. Mon application laissait quelque chose en cours d'exécution (le formulaire se fermait, mais un processus était toujours en cours) avecApplication.Current.Shutdown();
gbmhunter
4
Environment.Exit est certainement la bonne façon d'assurer l'arrêt d'une application. Avec Application.Current.Shutdown, vous pouvez facilement vous retrouver avec l'application s'exécutant indéfiniment si vous avez du code qui se repousse dans le répartiteur.
Marcus Andrén
Égal à Application.exit (0);
Sayka
Avec Application.Current.Shutdown();mon Closingévénement a été appelé, quand je voulais simplement arrêter mon application immédiatement. Alors , Environment.Exit(0);était le meilleur choix.
FredM
64

Comme l'a dit wuminqi , Application.Current.Shutdown();est irréversible, et je pense qu'il est généralement utilisé pour forcer une application à se fermer à certains moments, comme lorsqu'un utilisateur se déconnecte ou ferme Windows.

Appelez plutôt this.close()dans votre fenêtre principale. Cela revient à appuyer sur Alt+ F4ou sur le bouton de fermeture [x] de la fenêtre. Cela entraînera la fermeture de toutes les autres fenêtres possédées et finira par appeler Application.Current.Shutdown();tant que l'action de fermeture n'a pas été annulée. Veuillez consulter la documentation MSDN sur la fermeture d'une fenêtre .

En outre, comme il this.close()est annulable, vous pouvez placer une boîte de dialogue de confirmation des modifications dans le gestionnaire d'événements de fermeture. Créez simplement un gestionnaire d'événements <Window Closing="...">et modifiez-le en e.Cancelconséquence. (Voir la documentation MSDN pour plus de détails sur la façon de procéder.)

Allen Pestaluky
la source
2
+1 J'ai décidé de choisir celui-ci, d'autant plus que je dois enregistrer les fichiers ouverts avant de quitter l'application.
AgentKnopf
2
Une chose importante à noter ici est le fait qu'Allen a souligné un fait très important: toutes les autres fenêtres possédées seront fermées. 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 mais ne l'affichez pas encore, après avoir fermé la fenêtre active, la fenêtre masqué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.). J'ai testé ça.
BK
35

Utilisez l'un des éléments suivants, si nécessaire:

1.

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

2.

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

Surtout, les méthodes appellent closing eventde la Windowclasse et l'exécution peut s'arrêter à un moment donné (car généralement les applications mettent des dialogues comme 'êtes-vous sûr?' Ou ' Voulez-vous enregistrer les données avant de fermer? ', Avant qu'une fenêtre ne soit complètement fermée)

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

   Environment.Exit(0);
Kylo Ren
la source
18

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

Je n'appelle que 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 xbouton en haut à droite . Si l'une des méthodes appelle une fenêtre plus proche, Window_Closing(...)saisit l'événement pour l'arrêt si l'utilisateur le 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 auparavant à la dernière fermeture de 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'empêcher une fuite de mémoire complète est pour moi d'aller dans le Gestionnaire des tâches pour fermer l'application. Application.Current.Shutdown()me protège contre les défauts de conception involontaires.

Cela vient de mon expérience personnelle. En fin de compte, utilisez ce qui convient le mieux à votre scénario. Ceci est juste une autre information.

BK
la source
16

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

Applicationest une classe statique. Il ne fait pas référence à l'application actuelle. Vous devez accéder à l'application actuelle, puis la fermer comme suit:

Application.Current.Shutdown();
TimothyP
la source
8

Une autre façon de procéder:

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

Cela forcera la suppression de votre application. Cela fonctionne toujours, même dans une application multi-thread.

Remarque: faites juste attention à ne pas perdre de données non enregistrées dans un autre thread.

Ali Yousefi
la source
Cela semble incompréhensible: "en cours fonctionne toujours" . Peux-tu le réparer? Ou au moins expliquer ici dans les commentaires ce que vous voulez dire?
Peter Mortensen
C'est également partiellement incompréhensible: il suffit de se soucier d'une application qui a enregistré des données dans des fichiers d'un autre thread. Peux-tu le réparer? Ou au moins expliquer ici dans les commentaires ce que vous voulez dire?
Peter Mortensen
Utilisez-vous le traducteur de Google?
Peter Mortensen
non, ma moyenne est lorsque l'application s'exécute en tant que thread multiple et que vous utilisez Process.Kill, cela fonctionnera, mais une autre façon comme celle-ci. ne fonctionne pas dans les applications multithread lorsqu'un autre thread est en cours d'exécution.
Ali Yousefi
6
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);
}
Ravi
la source
ce n'est pas la réponse à la question, il veut seulement savoir comment quitter l'application wpf.
mehdi
6

Essayer

App.Current.Shutdown();

Pour moi

Application.Current.Shutdown(); 

n'a pas fonctionné.

Iwona Kubowicz
la source
6

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

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

wuminqi
la source
7
Je ne comprends pas ça. Nous pouvons cependant obtenir une confirmation de l'utilisateur avant d'appeler Application.Current.Shutdown().
Amsakanna
2
Je ne vois pas pourquoi vous devriez confirmer. Trop de confirmations est une très mauvaise chose. Le fait que quelqu'un ait pris l'effort de cliquer pour ouvrir le menu Fichier, se déplacer jusqu'en bas du menu Fichier, puis cliquer sur Quitter, est à peu près confirmé qu'il ne souhaite plus utiliser l'application.
Veer: Dans mon cas, la fenêtre de confirmation apparaît, mais même lorsque vous choisissez "Annuler" dans la confirmation, l'APP principale se ferme.
wuminqi
7
JTS: Il vaut mieux être conçu au cas par cas. Notre application, s'il y a des travaux en cours, la sortie de force causera des dommages, il vaut donc mieux les en informer dans la boîte de dialogue de confirmation
wuminqi
3

En résumé, il y a plusieurs façons de le faire.

1) Tuer le processus, qui saute la finalisation, la gestion des erreurs, etc.:

Process.GetCurrentProcess().Kill();

2) Arrêter l'application actuelle, ce qui est probablement le bon moyen car elle appelle les événements de sortie:

Application.Current.Shutdown();

ou

this.Shutdown();

(lorsque clled dans une instance de classe App)

3) Fermeture de l'application actuelle (tous les formulaires doivent être fermés / terminés plus tôt):

this.Close(); 

(lorsque clled dans une instance de classe App)

4) Quitter l'environnement, ce qui met fin à l'application:

Environment.Exit(0);

En outre, vous pouvez lire ici les statuts de sortie

burgund
la source
2

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 });
    }
}
Anders
la source
Que signifie «Caliburn micro flavoured» ?
Peter Mortensen
Comment y parvenir en utilisant Caliburn Micro
Anders
0

Si vous souhaitez quitter un autre thread qui n'a pas créé l'objet d'application, utilisez:

System.Windows.Application.Current.Dispatcher.InvokeShutdown();
SoumyaMahunt
la source
-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

Alpha-LIon
la source
2
Bienvenue à SO, Alpha-LIon! Les réponses uniquement codées sont déconseillées ici, car elles ne donnent aucune idée de la manière dont le problème a été résolu. Veuillez mettre à jour votre solution avec une explication de la façon dont votre code résout le problème de l'OP :)
Joel
-3

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

Command="SystemCommands.MinimizeWindowCommand"

Je pense que cela devrait être la voie préférée ...

Markus Sommerschnee
la source
Réduire! = Quitter l'application. Je ne vois pas d'option de sortie d'application dans cette liste. Il semble que la gestion des fenêtres et la fermeture de la fenêtre ne signifie pas nécessairement la fermeture de l'application. msdn.microsoft.com/en-us/library/…
kenny