2017-10-17 162 views
0

我試圖在後臺工作人員的DoWork方法中訪問TreeView控件的標頭屬性。WPF將TreeView傳遞給backgroundworker的DoWork方法

我曾嘗試以下:

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; 
} 

時引發說,我要訪問的屬性被另一個線程(在我的情況下,UI線程)擁有的錯誤。

到目前爲止,我只有到TreeView控制這個問題。通過然後訪問像LabelsTextBlocks這樣的「複雜」控件工作正常。

感謝您的每一個答案。

+0

在TreeView中處理更多數據的可能性比使用Label或TextBlock控件的處理數量更大。可能的重複[https://stackoverflow.com/q/9732709/6026377](https://stackoverflow.com/q/9732709/6026377) –

回答

0

規則是:只能訪問GUI線程上的GUI元素(控件)。在後臺線程上調用DoWork事件處理程序。您不能訪問該線程上的GUI元素。訪問意味着讀取或寫入屬性(或索引器)或調用方法。

如果您需要使用後臺線程上的控件執行某些操作,請使用Dispatcher.Invoke方法。但需要注意的是,使用方法可能會影響整體性能(例如,在緊密環路中使用時)。

您必須重新設計您的邏輯,以便您不需要訪問後臺線程上的GUI元素。這將是最好的解決方案。

順便說一句,我建議你從BackgroundWorker移動到現代異步模式(async/await & Task S)。