2010-02-11 4 views
3

J'essaye d'écrire une application WPF qui mettra à jour un ensemble de zones de texte et d'étiquettes lors de l'exécution en utilisant des threads mais le problème est que chaque fois qu'un thread essaie de mettre à jour les zones de texte J'ai l'erreur suivante: "Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède." Est-il possible de mettre à jour le contrôle au moment de l'exécution?Mettre à jour les contrôles WPF à l'exécution

Répondre

4

Oui, mais vous devez mettre à jour les éléments d'interface utilisateur dans le thread d'interface utilisateur à l'aide de Dispatcher.Invoke.

Exemple en C#: Au lieu de

myTextBox.Text = myText; 

utilisation

Dispatcher.Invoke(new Action(() => myTextBox.Text = myText)); 

VB.NET (avant la version 4) ne prend pas en charge les méthodes anonymes, donc vous devez le contourner avec un anonyme fonction:

Dispatcher.Invoke(Function() UpdateMyTextBox(myText)) 

... 

Function UpdateMyTextBox(ByVal text As String) As Object 
    myTextBox.Text = text 
    Return Nothing 
End Function 

Vous pouvez également démarrer vos threads d'arrière-plan à l'aide de la classe BackgroundWorker prenant en charge les mises à jour dans l'interface utilisateur via les événements ProgressChanged et RunWorkerCompleted: Les deux événements sont automatiquement déclenchés dans le thread d'interface utilisateur. Un exemple d'utilisation de BackgroundWorker peut être trouvé ici: SO question 1754827.

2

Les contrôles dans WPF ont une propriété Dispatcher sur laquelle vous pouvez appeler Invoke, en passant un délégué avec le code que vous souhaitez exécuter dans le contexte du thread graphique.

myCheckBox.Dispatcher.Invoke(DispatcherPriority.Normal, 
          () => myCheckBox.IsChecked = true); 
1

Pour une explication approfondie du modèle de thread WPF, y compris la façon dont les travaux Dispatcher, passez à la minute 17 this video de la randonnée à Mont atelier Avalon MIX09.

Questions connexes