2017-10-17 10 views
0

J'essaie d'accéder aux propriétés d'en-tête d'un contrôle TreeView dans la méthode DoWork d'un agent de fond.WPF Transférer TreeView à la méthode DoWork d'un arrière-plan

J'ai essayé ce qui suit:

var worker = new BackgroundWorker(); 
worker.DoWork += DoWork; 
worker.RunWorkerAsync(MyTreeView); 

private void DoWork(object sender, DoWorkEventArgs e) 
{ 
    var x = (e.Argument as TreeView); 
    var item1 = x.Items[0] as TreeViewItem; 

    //error here.. 
    var headerItem1 = item1.Header; 
} 

L'erreur qui est jetée dit que la propriété que je veux accéder appartient à un autre thread (le thread d'interface utilisateur dans mon cas).

J'ai rencontré ce problème uniquement avec le contrôle TreeView jusqu'à présent. Passer et ensuite accéder à moins de contrôles «complexes» comme Labels ou TextBlocks a bien fonctionné.

Merci pour chaque réponse.

+0

Il est possible que vous ayez à gérer plus de données dans un TreeView que vous étiez avec un contrôle Label ou TextBlock. Copie possible de [https://stackoverflow.com/q/9732709/6026377]https://stackoverflow.com/q/9732709/6026377) –

Répondre

0

La règle est la suivante: accéder uniquement aux éléments GUI (contrôles) sur le thread GUI.

Dans un BackgroundWorker, le gestionnaire d'événements DoWork sera appelé sur un thread d'arrière-plan. Vous n'êtes pas autorisé à accéder aux éléments de l'interface graphique sur ce thread. Accéder signifie lire ou écrire des propriétés (ou des indexeurs) ou des méthodes d'appel.

Si vous devez faire quelque chose avec un contrôle sur un thread d'arrière-plan, utilisez la méthode Dispatcher.Invoke. Mais attention, l'utilisation des méthodes Invoke/BeginInvoke peut avoir un impact sur les performances globales (par exemple lorsqu'elles sont utilisées dans une boucle étroite).

Vous devez repenser votre logique de telle sorte que vous n'ayez pas besoin d'accéder aux éléments de l'interface graphique sur un thread d'arrière-plan. Ce serait la meilleure solution.

D'ailleurs, je vous recommande de passer de la BackgroundWorker aux modèles asynchrones modernes (async/await & Task de s).