我想简单介绍如何为我的MVVM中的ItemsControl
数据绑定ObservableCollection
实现virtualizingstackpanel。
我在标签控件中为每个标签设置了ItemsControl
个实例,当ItemsControl
变大时,切换标签变得非常慢。
我可以做些什么来加速应用程序?
我打开了一个WPF探查器,发现每个选项卡的ItemsControl中显示的每个元素(自定义用户控件)都有自己的ContentPresenter
。所以我基本上有100个内容演示者在MVVM中的ObservableCollection
中运行100个项目。这是正确的吗?我该如何优化?
答案 0 :(得分:50)
有两种技术可能会有很大帮助。 Bea Stolnitz在她的blog上很好地描述了这两个。
第一个是UI Virtualization 第二个是Data Virtualization
在UI虚拟化中,您可以使用VirtualizingStackPanel之类的东西来减少UI的绘制。
数据虚拟化确保当您只显示100时,不会将一百万个对象带入内存。
因此,UI虚拟化最大限度地减少了绘制的内容,数据虚拟化最大限度地减少了可以绘制的内容。
希望有所帮助
答案 1 :(得分:9)
我使用TabControl和DataGrid在WPF中遇到了同样的问题。通过增加DataGrid元素大小,切换选项卡变得非常慢!之后,我发现这篇帖子正在读Bea Stolnitz的博客,就像之前的答案一样。这给了我谷歌“wpf tabcontrol VirtualizingStackPanel”的提示 这给了我DrWPF的链接:http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd
他准确地描述了问题并给出了解决方案: - ))
....性能打击是在树的构建过程中。不幸的是,如果是 您正在使用典型的MVVM方法,并对ItemsSource进行绑定 TabControl的属性,每次必须重建整个树 选中一个标签项。这通常是非常昂贵的操作。 ....