Comment obtenir une référence statique à une Fenêtre WPF?
J'ai essayé une énorme quantité de façons d'obtenir une référence statique de ma fenêtre en travers de mon programme. J'ai besoin d'accéder à l'ensemble de ses membres au moment de l'exécution de différentes classes, la référence statique est nécessaire.
Ce que j'aimerais avoir, c'est quelque chose comme Program.Window1
, où Core
est statique et MyWindow
est l'un de ses membres statiques.
En WinForms, j'ai l'habitude de déclarer mon formulaire statique dans le Programme.cs, mais cela ne semble pas fonctionner avec WPF et leur coutume "App.xaml" ApplicationDefinition.
Comment puis-je le faire?
Note: j'ai essayé un certain nombre de façons: à l'aide d'un appel direct à une nouvelle fenêtre (c'est à dire Program.Window1 = new Window1()
) ne fonctionnera pas, que je reçois du fil d'invalidité exception. Ce que je comprends pour l'instant, seuls ApplicationDefinitions pouvez lancer windows en WPF.
Ici est l'exception chaque fois que j'essaie de créer une fenêtre "code", et non par le défaut de XAML ApplicationDefinition de StartupUri:
Le thread appelant doit être PERSONNEL, parce que de nombreux composants de l'INTERFACE utilisateur, l'exigent.
OriginalL'auteur Lazlo | 2010-02-13
Vous devez vous connecter pour publier un commentaire.
Créer une classe statique qui peut contenir l'objet de la fenêtre, et puis quand la fenêtre est créée, il faut la passer à la classe statique, à partir de là, la classe statique à la main par la fenêtre de l'objet aux parties intéressées, même si la fenêtre de l'objet lui-même n'est pas statique. Quelque chose comme cela. Il n'est pas nécessaire pour votre forme statique, vous avez juste besoin d'un statique de place pour la tenue de la forme de l'objet.
OriginalL'auteur John Knoeller
Essayez ceci ((MainWindow)App.Actuel.Windows[0]).MainCanvas.
OriginalL'auteur Academy of Programmer
Il est tout à fait possible d'instancier votre propre windows avec WPF. Mais oui, vous devez être sur le "thread d'INTERFACE utilisateur" (qui est un thread STA).
Par exemple, disons que nous aimerions avoir une propriété sur notre Appli classe qui expose certains de la fenêtre.
Le problème avec ce code, comme vous l'avez expérimenté, en fonction de ce thread appelle la Mafenêtre getter,
new Window1()
échouera si le thread n'est pas un STA.Assurez-vous que la fenêtre est créée sur le fil de droite, entrez l'objet Répartiteur. Cet objet est utilisé tout au long de WPF pour s'assurer que la communication entre les éléments de l'INTERFACE utilisateur est faite sur le bon thread.
De retour à notre
new Window1
, nous pouvons utiliser l'Application.Objet répartiteur assurez-vous que lenew
opération est effectuée sur le thread principal de l'application, comme ceci:Ici, je choppe sur la demande du Répartiteur d'objet et les appels
Invoke
avec un délégué qui ne le réel newing.Invoke
veille à ce que mon délégué est exécutée dans le thread approprié, et retourne le résultat. Voila, la fenêtre est créée sans le redoutable STA erreur.Maintenant, ce que vous devez avoir à l'esprit que plus les appels effectués sur le Mafenêtre instance doit également être faite sur le bon thread. Pour éviter de salir votre code avec des appels à l'expéditeur.Invoquer, il pourrait être utile pour envelopper la fenêtre exemple derrière une API simple. E. g. un Spectacle méthode pourrait être mis en œuvre comme cela, assurez-vous de l'maréchal de l'appel via le Répartiteur objet de la fenêtre:
Alors c'est bon 🙂 Merci pour le vote!
OriginalL'auteur Peter Lillevold
J'ai utilisé cela avec succès. Déclarer une variable statique de type de fenêtre. Ensuite, dans le constructeur de la fenêtre définir la variable statique pour "ce". Je l'ai utilisé tout au long de l'application et il semble fonctionner correctement à partir de l'intérieur de statique ou de méthodes d'instance.
Par exemple, je suis capable de faire cela.
OriginalL'auteur howserss