C # WPF comment appliquer des instances uniques de Windows
Je voudrais savoir quelle est la meilleure façon (lire plus élégant) d'avoir une seule instance d'une Fenêtre donnée par l'application en WPF.
Je suis un nouveau venu .NET et WPF et que je suis venu avec l'air assez boiteux.
private static readonly Object MUTEX = new Object();
private static AboutWindow INSTANCE;
public static AboutWindow GetOrCreate() {
lock (MUTEX) {
if (INSTANCE == null) {
INSTANCE = new AboutWindow();
}
INSTANCE.Show();
return INSTANCE;
}
}
private AboutWindow() {
InitializeComponent();
}
private void AboutWindow_Closed(object sender, EventArgs e) {
//the Closed events are handy for me to update values across
//different windows.
lock (MUTEX) {
INSTANCE = null;
}
}
C'est... cela ressemble à proférer des conneries. Il doit y avoir un moyen d'atteindre le même objectif d'une manière beaucoup plus de manière élégante, droite?
PS: je suis souvent à l'aide de la Closed
événement pour modifier les valeurs dans les autres fenêtres ouvertes. Par exemple, j'ai le SettingsWindow avec le "Compte". Lorsque que j'appuie sur ce bouton, le AccountWindow pop-up. Quand je ferme les AcountWindowje veux quelque chose dans la SettingsWindow à changer (une étiquette). D'où la création constante de windows.
En outre, la fermeture est toujours quelque chose que vous avez à traiter en raison de la touche X sur le châssis de la fenêtre...
source d'informationauteur biasedbit
Vous devez vous connecter pour publier un commentaire.
Si vous avez vraiment besoin de mettre en place une instance unique d'une fenêtre, une instance statique (certains saveur de ce que vous avez) avec une usine méthode de création est certainement une option viable, un peu comme une seule instance DataContext lorsque vous travaillez avec une base de données.
Vous pouvez également écrire votre propre WindowManager classe, bien que cela semble exagéré, et sera essentiellement la même chose (à l'exception de l'Usine de méthodes dans une classe unique).
Cependant, la lecture de votre post, je me demande si c'est un cas de disparition de la forêt pour les arbres. Votre évocation de votre SettingsWindow, qui à son tour appelle AccountWindow, me fait penser qu'il faut simplement être à l'aide de ShowDialog(). Cela ouvre une fenêtre modal, ce qui signifie qu'il peut y avoir aucune interaction avec l'appel de la fenêtre (ou n'importe quelle autre fenêtre de l'application). Il suffit de définir une propriété dans cette boîte de dialogue, définissez les DialogResult true lorsque le bouton OK est pressée, et de lire que la propriété de la fenêtre parent.
Fondamentalement, vous utilisez simplement la ShowDialog comme ça. Je suis en laissant beaucoup de détails de mise en œuvre, d'autant que la liaison vs codage en dur des contrôles. Ces détails ne sont pas aussi important que de juste de voir comment ShowDialog œuvres.
Pour des raisons de simplicité, supposons que vous avez une classe appelée MyAppOptions que, eh bien, refléter les options de votre application. Je vais laisser de côté la plupart des détails de mise en œuvre de ce pour des raisons de simplicité, mais il serait probablement implémenter INotifyPropertyChanged, ont des méthodes et des champs et des propriétés, etc.
Ensuite, nous allons faire de ce simple, et supposons que vous voulez afficher une boîte de dialogue Options lorsque vous appuyez sur un bouton de certains de la fenêtre. En outre, je suppose qu'il y a des variables qui ont été fixés avec vos options, qui ont été chargés au démarrage.
Supposons maintenant que le OptionsDialog est une fenêtre que vous avez créé dans votre projet, et il a une Case à cocher sur elle liée à la MyBooleanOption et une zone de texte pour MyStringOption. Il dispose également d'un bouton Ok et un bouton Annuler. Le code-behind sera probablement utiliser la Liaison, mais pour l'instant nous allons coder en dur les valeurs.
C'est un joli exemple de base autant que les détails d'implémentation. Recherche en ligne pour ShowDialog pour plus de détails. Les clés importants à retenir sont:
c'est la seule fenêtre dans votre
application qui peut être en interaction
avec.
va fermer la boîte de dialogue, qui peut être
vérifié à partir de l'appel de la mère.
aussi fermer la boîte de dialogue, auquel cas
vous passez à jour les valeurs dans la
l'appel de la fenêtre.
sur la fenêtre définit automatiquement la
DialogResult de faux
il y a probablement de meilleures façons de le faire, mais ici, c'est un moyen relativement simple....
mettre un static bool sur la fenêtre de votre classe de drapeau si son ouvert ou pas. ensuite, dans le load() de l'événement est défini à true, et sur la clôture de l'événement le mettre à false. Ensuite, dans le code qui ouvre la fenêtre, vérifiez l'indicateur.
voici quelques pseudo-code pour vous donner une idée...
Suivantes s'étend sur la solution ci-dessus pour reshow la fenêtre si elle est déjà ouverte. Dans ce cas, il est une fenêtre d'aide.
Ce code est dans un viewmodel (MVVM) associé à la fenêtre. Il est appelé par un ICommand accroché à un bouton sur la fenêtre (naturellement, il affiche un point d'interrogation!!)
La propriété suivante est impliqué (dans ce cas c'est un Telerik RadWindow mais il peut être n'importe quel objet de la fenêtre, et vous pouvez aussi tout simplement mettre la poignée de la fenêtre, mais en utilisant cette propriété permet la manipulation de l'objet de manière plus fluide par exemple HelpWin.BringToFront() comme dans l'exemple ci-dessus...
Dans la fenêtre elle-même (fenêtre WPF)
et dans la vue de code Xaml
...
...
Comment sur l'utilisation d'un Singleton?
Alors utilisez simplement