7
votes

Obtenir le bon répartiteur WPF dans un fil

Dans le constructeur d'un objet, j'ai besoin de créer un objet MediaElement WPF: xxx

mais la classe peut également être instanciée d'un autre thread afin que je dois utiliser < Pré> xxx

Mais comment puis-je obtenir la bonne instance Dispatcher dans ce constructeur: S


0 commentaires

4 Réponses :


10
votes

Vous pouvez simplement utiliser Dispatcher. CurrentDispatcher .invoke ...

Toutefois, si, pour une raison quelconque qui ne fonctionne pas, vous pourriez avoir votre classe recevoir une référence au répartiteur dans le cadre de son constructeur. Il suffit de passer dans Dispatcher.CurrentDispatcher du fil de l'interface utilisateur au moment de la construction.


3 commentaires

Selon MSDN, cela retournera le répartiteur associé au thread actuel et créera une nouvelle celle-ci n'est pas déjà créée. Cela ne ressemble pas à quelque chose que vous voulez faire dans ce cas. Vous auriez besoin du répartiteur associé à l'interface utilisateur. Ou plus spécifiquement le répartiteur d'une fenêtre spécifique.


+1 pour passer une référence au répartiteur actuel.


Le Dispatcher statique.CurrentTrisPatcher n'a pas fonctionné pour moi dans un scénario similaire. J'ai essayé Application.Current.Dispatcher comme suggéré par Sinelaw - cela a fonctionné.




-2
votes

Si vous ajoutez des références à SYSTEM.WINDOWS.FORMS à votre projet, vous pouvez continuer à utiliser Application.Deevents () dans WPF.


0 commentaires

6
votes

Comme expliqué dans cette réponse :

Vous pouvez saisir le répartiteur de l'UI de l'instance d'application statique: application.current.dispatcher

Vous voudrez peut-être vérifier application.current pour NULL en premier, comme cela peut être effacé lors d'une séquence d'arrêt.

Aussi, Voici les docs pour la classe d'application.


1 commentaires

Vérification si application.current est NULL est en quelque sorte risqué. Il peut être valide lorsque vous le vérifiez (avec si ) dans le fil de travail, mais peut devenir null lorsque vous l'utilisez ensuite. Je mettez habituellement application.current.dispatcher.invoke dans le bloc Thy Catch.