Обновить элементы управления WPF во время выполнения - PullRequest
3 голосов
/ 11 февраля 2010

Я пытаюсь написать приложение WPF, которое будет обновлять набор текстовых полей и меток во время выполнения, используя потоки, но проблема в том, что когда поток пытается обновить текстовые поля и метки, я получаю следующую ошибку: «Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им». Можно ли обновить элемент управления во время выполнения?

Ответы [ 3 ]

4 голосов
/ 11 февраля 2010

Да, но вы должны обновить элементы пользовательского интерфейса в потоке пользовательского интерфейса, используя Dispatcher.Invoke .

Пример в C #: вместо

myTextBox.Text = myText;

использование

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

VB.NET (до версии 4) не поддерживает анонимные методы, поэтому вам придется обойти его анонимной функцией:

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

...

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

Кроме того, вы можете запустить фоновые потоки, используя класс BackgroundWorker , который поддерживает обновления в пользовательском интерфейсе с помощью событий ProgressChanged и RunWorkerCompleted: оба события генерируются в потоке пользовательского интерфейса автоматически. Пример использования BackgroundWorker можно найти здесь: SO вопрос 1754827 .

2 голосов
/ 11 февраля 2010

Элементы управления в WPF имеют свойство Dispatcher, для которого вы можете вызвать Invoke, передавая делегат с кодом, который вы хотите выполнить в контексте потока GUI.

myCheckBox.Dispatcher.Invoke(DispatcherPriority.Normal,
                             () => myCheckBox.IsChecked = true);
1 голос
/ 11 февраля 2010

Чтобы получить подробное объяснение модели потоков WPF, в том числе о том, как работает Диспетчер, перейдите к минуте 17 в этом видео из мастерской Hiking Mount Avalon в Mix09.

...