Comment faire pour que mon WPF MainWindow un singleton?
Je veux faire de ma MainWindow un singleton parce que je veux rendre l'accès à partir de toutes les autres fenêtres dans mon application plus facile. Mais je ne pouvais pas le faire fonctionner. Voici ce que j'ai fait.
Comme d'habitude, j'ai fait le MainWindow entrepreneur privé, et a créé un public static MainWindow Instance
propriété de retourner une instance statique. Quand je viens de l'exécuter sans aucune autre modification, j'ai eu "Aucune Source Disponible d'erreur". J'ai googlé l'Internet et a trouvé un sujet lié à http://www.netframeworkdev.com/windows-presentation-foundation-wpf/xamlc-singleton-class-80578.shtml. Cependant, je ne pouvais pas le faire fonctionner ce qui y est expliqué. Certains suggèrent de faire un changement dans la MainWindow.xaml de
<Window x:Class="TestApp.MainWindow"
à
<Window x:Class="TestApp.MainWindow.Instance"
Qui semble logique. Cependant, quand j'ai fait cela, j'ai eu des tonnes d'erreurs de compilation (le premier dit à l'espace de noms TestApp contient déjà une définition de la "MainWindow'.)
J'ai trouvé de nombreux articles sur l'Internet sur la façon de faire unique instance d'application. Je ne suis pas à la recherche de ce. Je veux juste faire mon MainWindow un singleton. Je l'ai fait en WinForm apps de nombreuses fois.
Vous devez vous connecter pour publier un commentaire.
Pour faire de la
MainWindow
un singleton, ce sont les étapes que vous devez effectuer:Ajouter un
MainWindow
Instance
àMainWindow
classe...Remarque: accesseur set est privé de manière à ce que personne d'autre ne peut le définir à quoi que ce soit d'autre.
Ajouter un constructeur statique dans
MainWindow
et de faire le constructeur deMainWindow
private
, comme ça...Maintenant supprimer
StartupUri="MainWindow.xaml"
de votreApp.xaml
fichier, de sorte que pas de fenêtre par défaut est lancé lorsque vous démarrez l'application. Attraper l'événement de Démarrage de votre classe App dans l'App.xaml.cs comme ceci:Instance
de lecture. Aussi, pour singleton normalement vous faites des constructeurs privés. Dans votre exemple, les consommateurs peuvent créer plusieurs MainWindow les instances et le dernier sera affecté àInstance
Instance
bien, mais ce n'est pas "pure" singleton à mon humble avisPas sûr à ce sujet faire singleton, mais pourquoi voudriez-vous? Vous pouvez simplement utiliser l'Application.Actuel.MainWindow afin d'obtenir l'Application.MainWindow propriété à tout moment à partir de n'importe où dans votre application.. Voir: http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow(v=VS.90).aspx.
Rendant singleton ne fait toujours pas de sens pour moi - comment est-ce que la rendre plus accessible? Vous pouvez toujours enregistrer la référence de votre fenêtre principale dans un public statique de la variable (ce qui pourrait être défini dans le constructeur de votre Fenêtre principale:
Mais alors, compte tenu de l'Application ci-dessus.Actuel.MainWindow pourquoi s'embêter..
Supprimer
StartupUri="MainWindow.xaml"
de votre App.xaml fichier. WPF ne lancera pas de n'importe quelle fenêtre pour vous.Ajouter un gestionnaire à l'
Startup
événement de votreApp
classe dans App.xaml.cs.Dans le présent appel de gestionnaire de la
Show()
méthode de votre instance du singleton.Remarque: La
App
classe a une propriété appeléeMainWindow
, donc dansApp_Startup()
je préfixé laMainWindow
classe avec l'espace de noms!Merci beaucoup à tous pour la rapidité de la answsers. Le point clé est que je dois enlever
StartupUri="MainWindow.xaml"
à partir de l'App.xaml. Merci aussi pour l'astuce de la statique constructeur. Un autre point que je veux mentionner, c'est que nous pouvons également remplacer OnStartup de démarrage de la fenêtre principale (juste pour faire quelques lignes plus courtes):