繁体   English   中英

从另一个线程更新treeview

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM