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

时间:2010-09-16 07:35:22

标签: wpf virtualization scrollviewer ui-virtualization

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

3 个答案:

答案 0 :(得分:48)

  

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

虚拟化需要基于项目的滚动,以便它可以跟踪当前视图中的逻辑单元(项目)...将ScrollViewer设置为基于像素的滚动,不再有逻辑单元的概念,只有像素!

答案 1 :(得分:6)

UI Virtualization

  

我经常被问到是否有办法解决这个限制。好吧,一切皆有可能,但没有 easy 解决方法。您必须重新实现当前虚拟化逻辑的重要部分,以将基于像素的滚动与UI虚拟化相结合。您还必须解决随之而来的一些有趣问题。例如,当项目容器具有不同高度时,如何计算拇指的大小? (请记住,您不知道虚拟化容器的高度 - 您只知道当前显示的容器的高度。)您可以假设基于您知道的高度的平均值,或者您可以保留列表中的项目高度作为项目被带入内存(当用户与控件交互时,这将增加拇指大小的准确性)。您还可以确定基于像素的滚动仅适用于具有相同高度的项目 - 这将简化解决方案。所以,是的,你可以想出一个解决方案来解决这个限制,但这并非无足轻重。

答案 2 :(得分:2)

您可以使用VirtualizingPanel.ScrollUnit="Pixel"(在.NET> = 4.5中)恢复虚拟化。