为什么将ScrollViewer.CanContentScroll设置为false会禁用虚拟化

正如大多数WPF开发人员所知,将ScrollViewer.CanContentScroll设置为false将禁用虚拟化; 但我想知道它是如何工作的,因为我尝试启用虚拟化,同时将ScrollViewer.CanContentScroll设置为false

“ScrollViewer目前允许两种滚动模式:平滑逐像素滚动(CanContentScroll = false)或离散逐项滚动(CanContentScroll = true)。目前WPF仅支持在按项目滚动时的UI虚拟化。基于像素的滚动是也称为“物理滚动”,并且基于项目的滚动也被称为“逻辑滚动”。

虚拟化需要基于项目的滚动,所以它可以跟踪目前在视图中的逻辑单元(项目)…设置ScrollViewer像素为基础的滚动他们不再是逻辑单元的概念,但只有像素!

UI虚拟化

我经常被问到是否有办法解决这个限制。 那么,任何事情都是可能的,但是没有简单的解决办法。 您将不得不重新实现当前虚拟化逻辑的重要部分,以将基于像素的滚动与UI虚拟化结合起来。 你也必须解决一些有趣的问题。 例如,当物品容器具有不同的高度时,如何计算拇指的大小? (请记住,您不知道虚拟化容器的高度 – 您只知道当前显示的容器的高度)。您可以根据您知道的高度来设定平均值,也可以使用项目高度作为项目被带入内存(这将增加拇指大小的准确性,因为用户与控制交互)。 你也可以决定,基于像素的滚动只适用于高度相同的项目 – 这将简化解决scheme。 所以,是的,你可以想出一个解决scheme来解决这个限制,但这不是微不足道的。