2010-05-26 3 views
6

J'ai un problème sérieux avec mon application WPF. J'ai réalisé une bibliothèque de contrôle WPF à utiliser en tant qu'Addin dans MS Office 2007.WPF Obtention d'un thread d'interface utilisateur ou affichage d'une fenêtre à partir d'un thread NON-UI

La classe WPF est instanciée par l'hôte et crée une barre d'outils avec certains boutons dans MS Office. En cliquant sur un bouton, la fenêtre wpf apparaît. Le problème est que je reçois toujours l'erreur suivante: "Le thread appelant doit être STA, car de nombreux composants d'interface utilisateur l'exigent." " Ma fonction principale est marquée comme [STAThread].

Il semble que l'événement button_Click s'exécute dans un autre thread que l'interface utilisateur.

J'ai essayé d'utiliser un répartiteur, mais cela n'a pas fonctionné. Je pense que le module reçoit un mauvais répartiteur, mais je ne sais pas exactement. Ensuite, j'ai essayé de démarrer la fenêtre dans un thread séparé et de rejoindre le fil, mais cela n'a pas fonctionné non plus. Comme j'ai supprimé l'attribut [STAThread] de la fonction principale, la fenêtre a démarré, mais je n'ai pas pu accéder à Office (parce que je suis dans un thread séparé).

Thread workerThread = new Thread(_ShowDialog); 
workerThread.SetApartmentState(ApartmentState.STA); 
workerThread.Start(); 
workerThread.Join(); 

Est-il pour déterminer le posible fil ui et créer un répartiteur pour ce thread, ou comment puis-je revenir au fil ui.

Alors aidez s'il vous plaît. Merci pour vos réponses.

Répondre

8

Vous devrez utiliser le répartiteur d'interface utilisateur de l'application. Essayez d'utiliser:

Application.Current.Dispatcher.Invoke(...) 
+1

Je crois que le nom par défaut pour Application est App dans les applications WPF. – DEHAAS

+0

Malheureusement Application.Current est null :(Autres idées? – MarkusEm

Questions connexes