2010-02-11 51 views
3

我正在嘗試編寫一個WPF應用程序,它將在運行時使用線程更新一組文本框和標籤,但問題在於,當有線程嘗試更新文本框和標籤時我得到以下錯誤:「調用線程不能訪問此對象,因爲不同的線程擁有它。」運行時是否可以更新控件?在運行時更新WPF控件

回答

4

是的,但您必須使用Dispatcher.Invoke更新UI線程中的UI元素。

在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類開始後臺線程,該類通過ProgressChangedRunWorkerCompleted事件支持UI中的更新:兩個事件均在UI線程中自動引發。使用BackgroundWorker的例子可以在這裏找到:SO question 1754827

2

WPF中的控件有一個Dispatcher屬性,您可以在其中調用Invoke,將代理與想要在GUI線程上下文中執行的代碼一起傳遞。

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

對於WPF線程模型的詳盡的解釋,包括調度的工作原理,從徒步旅行山阿瓦隆車間跳到分鐘17 this video在MIX09。