正如大多数 WPF 开发人员所知,设置ScrollViewer.CanContentScroll
为false
将禁用虚拟化;但我想知道它是如何工作的,因为我尝试在设置ScrollViewer.CanContentScroll
为false
.
3 回答
“ScrollViewer 目前允许两种滚动模式:平滑逐像素滚动 (CanContentScroll = false) 或离散逐项滚动 (CanContentScroll = true)。目前 WPF 仅在逐项滚动时支持 UI 虚拟化。基于像素的滚动是也称为“物理滚动”,基于项目的滚动也称为“逻辑滚动”。”
虚拟化需要基于项目的滚动,因此它可以跟踪当前视图中的逻辑单元(项目)......将 ScrollViewer 设置为基于像素的滚动,不再有逻辑单元的概念,只有像素!!!
我经常被问到是否有办法解决这个限制。好吧,一切皆有可能,但没有容易的事解决方法。您必须重新实现当前虚拟化逻辑的重要部分,才能将基于像素的滚动与 UI 虚拟化结合起来。您还必须解决随之而来的一些有趣的问题。例如,当项目容器具有不同的高度时,如何计算拇指的大小?(请记住,您不知道虚拟化容器的高度——您只知道当前显示的容器的高度。)您可以根据您知道的高度假设一个平均值,或者您可以保留一个包含将项目带入内存时的项目高度(当用户与控件交互时,这将提高拇指大小的准确性)。您还可以决定基于像素的滚动仅适用于具有相同高度的项目——这将简化解决方案。所以,是的,
VirtualizingPanel.ScrollUnit="Pixel"
您可以使用(在 .NET >= 4.5 中)恢复虚拟化。