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
控制这个问题。通过然后访问像Labels
或TextBlocks
这样的“复杂”控件工作正常。
感谢您的每一个答案。
答
规则是:只能访问GUI线程上的GUI元素(控件)。在后台线程上调用DoWork
事件处理程序。您不能访问该线程上的GUI元素。访问意味着读取或写入属性(或索引器)或调用方法。
如果您需要使用后台线程上的控件执行某些操作,请使用Dispatcher.Invoke
方法。但需要注意的是,使用方法可能会影响整体性能(例如,在紧密环路中使用时)。
您必须重新设计您的逻辑,以便您不需要访问后台线程上的GUI元素。这将是最好的解决方案。
顺便说一句,我建议你从BackgroundWorker
移动到现代异步模式(async
/await
& Task
S)。
在TreeView中处理更多数据的可能性比使用Label或TextBlock控件的处理数量更大。可能的重复[https://stackoverflow.com/q/9732709/6026377](https://stackoverflow.com/q/9732709/6026377) –