如何在标准WPF ListView中启用UI虚拟化

我正在使用.NET 4.5 / VS2012,我有一个ListView看起来像这样

            -  logs                       

但性能仍然没有改善。 我找到了一个使用ListBox的例子,但是如何虚拟化ListView? 我挣扎了很多。 我听说通过分组,在以前版本的WPF中关闭了虚拟化,但是使用.NET 4.5,WPF有一个IsVirtualizingWhenGrouping属性,我已经将它设置为True

更新 :罪魁祸首是自定义样式,删除后,列表视图像黄油一样平稳运行

这篇文章对你有很大帮助。也可以看到..

  • ListView UI虚拟化
  • WPF数据虚拟化ListView

“UI虚拟化仅在内存中存储可见项目, 但在数据绑定方案中将整个数据结构存储在内存中 。相比之下,数据虚拟化仅存储内存中屏幕上可见的数据项。”

“默认情况下,当ListView和ListBox控件的列表项绑定到数据时,会为其启用UI虚拟化。”

有关详细信息,请查看原始MSDN源。

我知道这是一个老问题,但我遇到它寻找我的问题的答案,并希望分享我发现的,以防它对其他人有用。 我有一个非虚拟化的ListView控件非常类似的情况。 我删除了它上面的自定义样式(阅读此线程和相关链接后),它开始正确虚拟化。

经过大量调查,与默认模板进行比较,并缩小范围,我发现它是该模板内ScrollContentPresenter上的’CanContentScroll’属性。 我根本没有设置它,当我将它设置为true时,它开始正确虚拟化。 我还注意到默认模板的’CanHorizo​​ntallyScroll =“False”’和’CanVerticallyScroll =“False”’; 那些似乎没有什么区别,我可以在我的有限测试中告诉我(我确信有人可以插入并说出他们做了什么)但是我还是把它们留了下来。

这是我的最终样式(请注意,这是从默认和修改开始的,所以不确定CanContentScroll属性被删除的位置……):