Application WPF N'est pas Fermé Lors de la Fermeture de la Fenêtre Principale
Je suis habitué à WinForms de la programmation en Visual Studio, mais je voulais donner WPF essayer.
J'ai ajouté une autre fenêtre de mon projet, appelé Window01. La fenêtre principale est appelée MainWindow. Avant la public MainWindow()
constructeur je déclare Window01:
Window01 w1;
Maintenant, je instancier cette fenêtre:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
w1 = new Window01();
}
J'ai un bouton où l'ouverture de la fenêtre: w1.ShowDialog();
.
Le "drôle", c'est ici le fait que si je lance l'application (débogage) et à la sortie il y a quelques secondes après (je ne fais rien dans l'application), Visual Studio ne veut pas arrêter le débogage, comme si l'application est toujours en cours d'exécution.
Si je déplace la ligne w1 = new Window01();
du bouton, cliquez sur la méthode, sens juste au-dessus de ShowDialog()
, Visual Studio fonctionne correctement, le débogage s'arrête lorsque je quitte l'application.
Pourquoi cet étrange comportement?
Vous devez vous connecter pour publier un commentaire.
Dans votre
MainWindow.xaml.cs
, essayez de faire cela:Par ce lien, vous pouvez également définir la
ShutdownMode
en XAML:http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx
Applications d'arrêter l'exécution que lorsque le
Shutdown
méthode de laApplication
est appelé. L'arrêt peut se produire implicitement ou explicitement, comme spécifié par la valeur de laShutdownMode
propriété.Si vous définissez
ShutdownMode
àOnLastWindowClose
, Windows Presentation Foundation (WPF) appelle implicitement à l'Arrêt quand la dernière fenêtre de l'application se ferme, même si actuellement instancié windows sont définies comme la fenêtre principale (voir MainWindow).Un
ShutdownMode
deOnMainWindowClose
causes WPF implicitement appel à l'Arrêt quand le MainWindow ferme, même si d'autres fenêtres actuellement ouvertes.La durée de vie de certaines applications peuvent ne pas être dépendante lorsque la fenêtre principale ou la fenêtre est fermée, ou peut ne pas être tributaire du tout windows. Pour ces scénarios, vous devez définir la
ShutdownMode
propriétéOnExplicitShutdown
, qui exige explicitementShutdown
appel de la méthode pour arrêter l'application. Sinon, l'application continue de fonctionner en arrière-plan.ShutdownMode
peut être configuré de manière déclarative à partir de XAML ou par programme à partir du code.Cette propriété est disponible uniquement à partir du thread qui a créé le
Application
objet.Dans votre cas, l'application n'est pas de clôture, parce que vous êtes probablement en utilisant la valeur par défaut
OnLastWindowClose
:Si vous définissez
ShutdownMode
àOnLastWindowClose
, WPF appelle implicitement à l'Arrêt quand la dernière fenêtre de l'application se ferme, même si actuellement instancié windows sont définies comme la fenêtre principale (voirMainWindow
).Puisque vous êtes à l'ouverture d'une nouvelle fenêtre, et pas de fermeture, la fermeture n'est pas appelée.
Je suis content que vous avez obtenu votre réponse, mais pour le bien des autres, je vais répondre à votre question, comme bien d'ajouter quelques informations.
Étape 1
D'abord, si vous voulez que votre programme de sortie lorsque la fenêtre principale est fermé, vous devez spécifier, puisque ce n'est pas WinForms où ce comportement est celui par défaut.
(La valeur par défaut dans WPF, c'est quand la dernière fenêtre se ferme)
Dans Le Code
Aller à votre instance de l'application dans votre point d'entrée (Dans VS 2012 du programme WPF la valeur par défaut est imbriquée à l'intérieur d'
App.xaml
, alors allez à l'intérieur de et accédez àApp.xaml.cs
& créer un constructeur).Dans le constructeur de préciser que votre
Application
'sShutdownMode
devrait êtreShutdownMode
.OnLastWindowClose
.En XAML
Aller à votre
App.xaml
fichier que VS 2012 créé par défaut (ou le créer vous-même)La racine est un
Application
, spécifier à l'intérieur de votreApplication
'sShutdownMode
devrait êtreShutdownMode
.OnLastWindowClose
.Si elle fonctionne, vous avez terminé; vous pouvez arrêter de lire.
Étape 2
Si le ci-dessus ne fonctionne pas (je suppose que vous avez écrit le WPF application à partir de zéro), la fenêtre principale n'est probablement pas connu à l'application que la fenêtre principale.
Afin de spécifier que bien.
Dans Le Code
Passez à la demande du constructeur, comme vous l'avez fait à l'Étape 1, et de préciser que
Application
.MainWindow
's valeur de votreWindow
:En XAML
Aller à la
Application
XAML comme vous l'avez fait à l'Étape 1, et de préciser queApplication
.MainWindow
's valeur de votreWindow
:Alternative
Je ne pense pas que c'est la meilleure approche, tout simplement parce que WPF ne veut pas que vous pour le faire (donc, il a
Application
'sShutdownMode
), mais vous pouvez n'en utiliser qu'un événement /remplacement d'un événement de la méthode (OnEventHappened).Aller à la MainWindow du fichier code-behind et d'ajouter:
Car la valeur par défaut en mode arrêt dans une application WPF est Surfermeturedernierefenetre, ce qui signifie que l'application s'arrête lorsque le dernier de la fenêtre se ferme.
Lorsque vous instancier un nouvel objet de la Fenêtre, elle est automatiquement ajoutée à la liste de windows dans l'application. Donc, le problème est que votre demande a été la création de deux fenêtres quand il a commencé - le MainWindow et le pas-encore-indiqué Window01 - et si vous n'fermé le MainWindow, le Window01 permettrait de maintenir l'exécution de votre application.
Normalement, vous allez créer un objet de la fenêtre dans la même méthode, c'est d'aller en appel de sa ShowDialog, et vous permettra de créer un nouvel objet de fenêtre à chaque fois que la boîte de dialogue est affichée.
Il ressemble à quelque chose que j'ai rencontré lorsque j'ai créé une deuxième fenêtre pour agir en tant que boîte de dialogue. Lors de la deuxième fenêtre a été ouverte puis fermée et la fenêtre principale a été fermée, l'application restent en cours d'exécution (dans le fond). J'ai ajouté (ou confirmé) la suite de mon Application.xaml:
Pas de joie.
Donc, je me suis finalement allé dans mon "MainWindow.xaml" et a ajouté "Fermé" sur la Fenêtre qui est allé à un "MainWind_Closed" méthode qui se présente comme suit:
Cours d'exécution à travers le débogueur, il semble que la seule fenêtre qui s'affiche est la fenêtre que j'ai créé comme un dialogue--en d'autres termes, la boucle foreach trouve uniquement une fenêtre--la boîte de dialogue, pas le principal.
J'avais "ce.Close()" en cours d'exécution dans la méthode qui a fermé la boîte de dialogue, et j'ai eu un "dlgwin.Close()" qui est venu après le "dlgwin.ShowDialog()", et qui n'a pas fonctionné. Même pas un "dlgwin = null".
Alors, pourquoi ne serait-il pas que la boîte de dialogue fermer sans extra ce truc? Oh bien. Les travaux de cette.
Je suis tombé sur cette Question lors de la recherche d'autre chose et j'ai été surpris de voir que je ne pouvais pas voir toutes les propositions de réponses de mentionner au sujet de
Window.Owner
.Un appel à
Window.GetWindow(this)
est tout à fait utile en Vue d'une application MVVM lorsque vous êtes loin vers le bas de l'arborescence visuelle ne sachant pas où vous avez été instancié, il peut être appelé par la fourniture de touteFrameWork
élément (par exemple,UserContol
,Button
,Page
). Évidemment, si vous avez une référence directe à la fenêtre, puis l'utiliser ou mêmeApplication.Current.MainWindow
.C'est tout à fait une relation puissante qui a un certain nombre d'avantages utiles que vous pourriez ne pas réaliser pour commencer (en supposant que vous n'avez pas spécialement codé des fenêtres séparées pour éviter ces relations).
Si nous faisons appel à votre fenêtre principale
MainWindow
et la deuxième fenêtre deAdditionalWindow
alors....MainWindow
permettrait aussi de réduire lesAdditionalWindow
MainWindow
sera également restaurerAdditionalWindow
MainWindow
va fermerAdditionalWindow
, mais la fermeture deAdditionalWindow
ne fermera pasMainWindow
AdditioanlWindow
ne sera jamais "perdu" en vertu deMainWindow
, c'est à direAddditionalWindow
montre toujours au-dessus deMainWindow
dans l'ordre z si vous avez utiliséShow()
pour l'afficher (très utile!)Une chose à noter, cependant, si vous disposez de cette relation, alors la
Closing
de l'événement sur laAdditionalWindow
n'est pas appelé, alors vous feriez manuellement itérer sur lesOwnedWindows
collection. par exemple, Créer un moyen d'appeler chaque fenêtre via une nouvelle Interface, ou méthode de classe de base.