从另一个线程更新treeview
本文关键字:treeview 更新 线程 另一个 | 更新日期: 2023-09-27 18:09:36
我对c# (WPF)中的线程很陌生,因为我已经成功地实现了一些标签和进度条更新,我不明白为什么当我试图从另一个单独线程中调用的类向GUI的treeView添加项目时,我得到了一个异常:
类型为"System"的未处理异常。InvalidOperationException"发生在WindowsBase.dll
附加信息:调用线程无法访问此对象因为它属于另一个线程。
我的更新树视图代码如下:
private void updateTreeView(TreeView tree, List<TreeViewItem> items, Boolean clear) {
tree.Dispatcher.Invoke(new Action(() => {
if (clear) {
tree.Items.Clear();
}
ItemCollection treeitems = tree.Items;
foreach (TreeViewItem item in items) {
treeitems.Dispatcher.Invoke(new Action(() => {
treeitems.Add(item);
}));
}
tree.ItemsSource = treeitems;
}));
}
异常指向:
treeitems.Add(项);
您可以使用以下命令:
delegate void DUpdateTreeView(TreeView tree, List<TreeViewItem> items, Boolean clear);
private void UpdataTreeView(TreeView tree, List<TreeViewItem> items, Boolean clear)
{
if (tree.InvokeRequired)
{
DUpdateTreeView d = new DUpdateTreeView(UpdataTreeView);
// replace this by the main form object if the function doesn't in the main form class
this.Invoke(d, new object[] { tree, items, clear });
}
else
{
if (clear)
{
tree.Items.Clear();
}
else
{
// Here you can add the items to the treeView
/***
ItemCollection treeitems = tree.Items;
foreach (TreeViewItem item in items)
{
treeitems.Dispatcher.Invoke(new Action(() =>
{
treeitems.Add(item);
}));
}
tree.ItemsSource = treeitems;
***/
}
}
}
这是一个非常老的问题,但我想我会回答它。样本中有两个调度员。你有一个树视图,你正在获得它的线程和一个列表,似乎是在另一个线程中创建的。
但是代码应该看起来更像这样。对不起,VB在这种情况下,我在调用中使用委托。
tree.Dispatcher.BeginInvoke(Sub()
Dim node = new TreeViewItem() With {.Header = "Header"}
tree.items.add(node)
End Sub)
我没有跳出UI线程来添加节点,就像在原来的问题。