2013-03-14 3 views
0

J'ai essayé d'autres questions pour ajouter du contenu à un bloc de texte WPF à partir de threads de travail en utilisant Dispatcher. J'utilise la méthode suivante:InvalidOperationException Mise à jour de TextBlock

private void AppendLineToChatBox(Inline message) 
{   
    chatBox.Dispatcher.BeginInvoke(new Action(() => 
    { 
     chatBox.Inlines.Add(message); 
     chatBox.Inlines.Add("\n"); 
     scroller.ScrollToBottom(); 
    })); 
} 

avec XAML:

<Grid Height="200" Width="300" HorizontalAlignment="Left"> 
    <ScrollViewer Name ="scroller"> 
     <TextBlock TextWrapping="Wrap" Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="chatBox" /> 
    </ScrollViewer> 
</Grid> 

Quand j'appelle AppendLineToChatBox() à partir d'un fil de fond, je reçois toujours l'exception suivante:

système. InvalidOperationException was unshandled HResult = -2146233079
Message = Le thread appelant ne peut pas accéder à cet objet car un thread différent de possède il.

La méthode correcte serait grandement appréciée.

+1

A quelle ligne ne se l'exception maintenant? Vous êtes sûr qu'il ne s'agit pas de 'scroller.ScrollToBottom()'? – maximpa

+0

exception est levée par chatBox.Inlines.Add (message) – CanCan

+0

Je ne pense pas que ce soit une question en double car j'utilise déjà le répartiteur. – CanCan

Répondre

1

La classe Inline hérite de DispatcherObject, ce qui signifie que tous les objets créés de cette classe sont liés au thread sur lequel ils sont créés. En regardant votre code, il semble que la méthode AppendLineToChatBox est appelée par un thread de travail, et le thread de travail possède également l'objet Inline.

Pour résoudre ce problème, vous devrez construire l'objet en ligne dans le thread d'interface utilisateur (par exemple le bloc de code dans le BeginInvoke)

+0

Merci pour votre réponse. – CanCan

Questions connexes