【发布时间】:2011-08-01 19:15:27
【问题描述】:
我有一个 WPF TreeView,其中每个 TreeViewItem 都有一个复选框。我的实现基于 Josh Smith 的优秀文章中提供的示例:http://www.codeproject.com/KB/WPF/TreeViewWithCheckBoxes.aspx。与文章中一样,我使用的行为是,当一个项目被选中或取消选中时,它的所有子项目都应该分别被选中或取消选中。
我的问题是我的 TreeView 可以包含数以万计的项目。因此,如果最初未选中所有项目,然后我检查根项目,则可能需要 10-20 秒才能更新所有后代。这对我的用户来说太慢了,我想知道是否有办法加快 UI 更新。我相当肯定 PropertyChanged 事件是这里的罪魁祸首,因为当我删除它们时,检查根项目几乎是即时的,尽管子复选框没有得到更新。是否有更好的方法来同时处理更新多个 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 };
感谢您的任何想法,
-克雷格
【问题讨论】:
-
你是在 Windows Vista/7 上运行这个吗?
-
正如 dlev 指出的那样,虚拟化可能是您最好的选择。但是对于 Aero 主题,复选框会为其状态转换设置动画。这意味着对于每个 CheckBox,您正在启动一个动画。解决此问题的唯一方法是使用带有不使用 BulletChrome 元素的 ControlTemplate 的自定义 CheckBox 样式。
-
@CodeNaked:实际上,我们使用的是自定义主题,但我会仔细检查这里没有使用动画,因为我同意这也会减慢速度。谢谢。