2013-03-14 2 views
0

Я попытался выполнить другие вопросы, чтобы добавить некоторый контент в текстовый блок WPF из рабочих потоков с помощью Диспетчера. Я использую следующий метод:InvalidOperationException Обновление TextBlock

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

с XAML:

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

Когда я называю AppendLineToChatBox() из фонового потока я все еще получаю следующее исключение:

системы. InvalidOperationException не было обработано HResult = -2146233079
Message = вызывающий поток не может получить доступ к этому объекту, так как принадлежит Это.

Правильный метод был бы признателен.

+1

На какой линии получить исключение сейчас? Вы уверены, что дело не в 'scroller.ScrollToBottom()'? – maximpa

+0

Исключение выбрано chatBox.Inlines.Add (message) – CanCan

+0

Я не думаю, что это дублированный вопрос, поскольку я уже пользуюсь диспетчером. – CanCan

ответ

1

Класс Inline наследуется от DispatcherObject, что означает, что любые объекты, созданные этим классом, привязаны к потоку, в котором они созданы. От взгляда на ваш код, похоже, что метод AppendLineToChatBox вызывается рабочим потоком, а рабочий поток также имеет объект Inline.

Чтобы решить эту проблему, вам нужно будет построить объект Инлайн в потоке пользовательского интерфейса (например, блок кода в BeginInvoke)

+0

Благодарим вас за ответ. – CanCan

Смежные вопросы