gpt4 book ai didi

wpf - 如何提高检查 WPF TreeView 中所有项目的性能?

转载 作者:行者123 更新时间:2023-12-02 12:24:50 29 4
gpt4 key购买 nike

我有一个 WPF TreeView,其中每个 TreeViewItem 都有一个复选框。我的实现基于 Josh Smith 的优秀文章中提供的示例:http://www.codeproject.com/KB/WPF/TreeViewWithCheckBoxes.aspx 。正如在文章中一样,我使用的行为是,当选中或取消选中某个项目时,应分别选中或取消选中其所有子项目。

我遇到的问题是我的 TreeView 可以包含数万个项目。因此,如果最初未选中所有项目,然后检查根项目,则可能需要 10-20 秒才能更新所有后代。这对于我的用户来说太慢了,我想知道是否有办法加快 UI 更新。我相当确定 PropertyChanged 事件是这里的罪魁祸首,因为当我删除它们时,检查根项目几乎是即时的,尽 pipe 复选框没有更新。有没有更好的方法来处理同时更新多个 UI 元素?请注意,我尝试使用容器回收,但这似乎没有帮助。

如果您想尝试自己重现此内容,可以下载上述文章中的项目,然后在 FooViewModel.cs 中,更改 CreateFoos() 函数以使用以下代码:

var root = new FooViewModel("Weapons");
root.IsInitiallySelected = true;

for (int i = 0; i < 400; i++)
{
var table = new FooViewModel("Table " + i);
for (int j = 65; j < 91; j++)
{
var charItem = new FooViewModel(Convert.ToChar(j).ToString());
for (int k = 0; k < 3; k++)
{
var deepItem = new FooViewModel("Item " + k);
charItem.Children.Add(deepItem);
}

table.Children.Add(charItem);
}

root.Children.Add(table);
}

root.Initialize();
return new List<FooViewModel> { root };

感谢您的任何想法,

-克雷格

最佳答案

呈现包含 10,000 个项目的 TreeView 的 UI 可能需要重新设计。 (虽然不一定 - 如果您的文件系统足够复杂,浏览文件夹对话框基本上会执行此操作。)

假设您不尝试虚拟化,您可以尝试以下两件事:

  1. TreeViewItem.IsExpanded 绑定(bind)到节点 View 模型中的 bool 属性。仅当其父节点的 IsExpanded 属性为 true 时,节点才应引发 PropertyChanged 事件。这将使不可见的叶节点不会引发可视化树必须忽略的事件。 (您可能还会发现,每当其父级的 IsExpanded 属性变为 true 时,您都需要让节点在其 IsChecked 属性上引发 PropertyChanged。)当树完全展开时,这仍然会出现问题,但除非您一开始就以这种状态向用户呈现树,否则用户将不得不努力使控件进入开始遇到性能问题的状态。

  2. 当父节点更新其后代时,切勿引发 PropertyChanged 事件。相反,让拥有的 View 模型在 TreeViewItemsSource 绑定(bind)到的属性上引发 PropertyChanged。这将迫使整个控件重新渲染,但这很可能比处理来自所有节点的单独更新更快。 (当然,您需要实现某种方式让节点通知其父节点它刚刚更新了其后代 - 例如引发事件 - 以及某种方式告诉节点如果正在更新其子节点,则不应引发此事件后代,因为它的 parent 告诉它。)

关于wpf - 如何提高检查 WPF TreeView 中所有项目的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5600337/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com