[英]Update treeview from another thread
我对C#(WPF)中的线程还很陌生,并且由于我已经成功实现了一些标签和进度条更新,所以我不明白为什么当我尝试从另一个线程中调用的另一个类中向GUI的treeView添加项目时我有一个例外:
WindowsBase.dll中发生了'System.InvalidOperationException'类型的未处理异常
附加信息:调用线程无法访问该对象,因为另一个线程拥有它。
我的更新树视图代码是这样的:
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;
***/
}
}
}
这是一个非常老的问题,但我认为我会回答。 您的样本中有两个调度程序。 您有一个正在获取其线程的树视图,以及一个似乎在其他线程中创建的列表。
但是代码看起来应该更像这样。 抱歉,在这种情况下,我在调用内使用了委托。
tree.Dispatcher.BeginInvoke(Sub()
Dim node = new TreeViewItem() With {.Header = "Header"}
tree.items.add(node)
End Sub)
我没有跳出UI线程来添加节点,就像原始问题一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.