Comment puis-je m'assurer que seulement une Fenêtre WPF est ouvert à la fois?
J'ai une fenêtre WPF que je suis en train de lancer à partir de l'intérieur d'une application winform. Je veux seulement permettre à la fois instance de la fenêtre WPF pour être ouvert à la fois, et de ne pas avertir l'utilisateur si ils essaient de l'ouvrir à nouveau.
Je vais avoir un problème, toutefois, en essayant de recherche pour que WPF fenêtre étant ouverte parce que la fenêtre est en train d'être lancé à partir d'un winform. Ce que j'ai normalement le faire est lorsque vous recherchez une winform, je recherche toutes les instances de ce winform existant dans le Application.Current.OpenForms
, et quand en WPF, je recherche pour Application.Current.Windows
Le problème que j'ai c'est que System.Windows.Application.Current
est nul lorsqu'il est lancé à partir de l'intérieur d'un winform, je ne peux donc pas la recherche de la fenêtre de WPF de cette façon. Est-il meilleure façon de chercher une instance existante d'une fenêtre ouverte?
Mon Code:
if (System.Windows.Application.Current != null)
{
foreach (System.Windows.Window win in System.Windows.Application.Current.Windows)
{
if (win is frmCaseWpf)
{
MessageBox.Show("You may have only one active case open at a time.", "Open Case",
MessageBoxButtons.OK,
MessageBoxIcon.Stop);
win.WindowState = System.Windows.WindowState.Normal;
win.Focus();
win.Activate();
return;
}
}
}
OriginalL'auteur Russ | 2009-08-26
Vous devez vous connecter pour publier un commentaire.
Au lieu de chercher la statique des objets de l'application, vous pouvez simplement suivre ce au sein de votre fenêtre, avec une seule variable statique. Il suffit de garder une variable dans la fenêtre:
Lorsque vous créez une fenêtre, soit dans l'initialisation des routines, ou OnLoaded, selon la façon dont vous le souhaitez..:
Si vous voulez que cette fenêtre soit réutilisable, assurez-vous de définir ce.openWindow = null; lorsque vous fermez la fenêtre, ainsi.
this.OpenWindow
n'existe pas. Est-il une alternative?Je pense qu'il veux dire, c'est de faire
frmCaseWpf
classe singleton. openWindow est en fait une variable qu'il a déclaré dansfrmCaseWpf
OriginalL'auteur Reed Copsey
Voici quelque chose qui fonctionne pour moi.
OriginalL'auteur Brian Rizo
Il serait mieux de l'frmCaseWpf classe un singleton. De cette façon, vous ne peut pas créer une autre instance
OriginalL'auteur Thomas Levesque
Plutôt que d'essayer de chercher une Fenêtre, par exemple, de nombreuses personnes utilisent une session (ou système) de large "Mutex" ou un verrou d'Exclusion Mutuelle. J'allais réécrire pour vous, mais j'ai trouvé une bonne codeproject article illustrant la technique. Il n'est pas complexe et très simple.
http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx?msg=2908697
Sneak peek:
Espère que cette aide.
(edit: bien sûr, vous aurez de la modifier légèrement pour votre cas d'utilisation, mais il démos de l'idée générale)
urgh, à droite. J'ai mal lu. comment dur est-ce? suivre avec un statique drapeau... sheesh.
C'est pourquoi j'ai choisi la réponse que j'ai à choisir, étant donné que le suivi avec un statique marquer résolu mon problème. C'était difficile parce que je n'avais jamais fait ça, et tout le monde sur mon équipe a été congédié tout à fait il ya un moment, donc il n'y a pas d'autres trop nombreux pour rebondir problèmes plus. Aussi, je ne vois pas beaucoup d'informations sur le net à propos de l'interopérabilité entre les winforms et wpf, dont je suis assez lourd avec cette application particulière.
OriginalL'auteur x0n
Je ne suis pas vraiment un " bon " programmeur, mais j'ai atteint ce niveau dans une application WPF (et non à partir d'un winforms) en utilisant les suivantes:
Essentiellement parce que je suis de la fenêtre de création d'objet à l'extérieur de la sous qui s'ouvre, il n'y aura qu'une seule fenêtre. Tout nouvel appel à la fenêtre ouverte sous utilisera le même objet. Mais je suppose que c'est ce que Thomas se réfère aussi.
Comme je l'ai dit, vous ne savez pas si cela va vous aider ou pas.
OriginalL'auteur TravisPUK
Vous pouvez utiliser XXXwindown.isLoad pour vérifier si la fenêtre est chargé avant de créer une nouvelle fenêtre:
OriginalL'auteur Benicio