WPF将TreeView传递给backgroundworker的DoWork方法

WPF将TreeView传递给backgroundworker的DoWork方法

问题描述:

我试图在后台工作人员的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) –

规则是:只能访问GUI线程上的GUI元素(控件)。在后台线程上调用DoWork事件处理程序。您不能访问该线程上的GUI元素。访问意味着读取或写入属性(或索引器)或调用方法。

如果您需要使用后台线程上的控件执行某些操作,请使用Dispatcher.Invoke方法。但需要注意的是,使用方法可能会影响整体性能(例如,在紧密环路中使用时)。

您必须重新设计您的逻辑,以便您不需要访问后台线程上的GUI元素。这将是最好的解决方案。

顺便说一句,我建议你从BackgroundWorker移动到现代异步模式(async/await & Task S)。