1

我有一个具有以下属性的虚拟化 TreeView:

<TreeView
    ScrollViewer.CanContentScroll="True" 
    VirtualizingPanel.IsVirtualizing="True"
    VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
    VirtualizingStackPanel.ScrollUnit="Pixel"  
    VirtualizingStackPanel.CacheLength="20,20"
    VirtualizingStackPanel.CacheLengthUnit="Item"
    />
  ...
</TreeView>

TreeViewItem 的高度大致相同。

问题是,当向下滚动时,滚动条的手柄会改变大小并且滚动是“跳跃的”,这会导致用户体验很差。

如何获得更流畅的用户体验?

4

2 回答 2

1

我意识到这是一篇旧帖子,您现在可能有一个解决方案,但它有一个简单的答案,因此对于将来可能遇到此问题的任何人,这里是:

你描述的行为是正常的。如果您在 MSDN 中搜索ScrollViewer.CanContentScroll您使用的第一个属性,您会发现:

ScrollViewer 中的内容可以按物理单位或逻辑单位滚动。物理单位是与设备无关的像素。逻辑单元用于在 ItemsControl 中滚动项目。ScrollViewer 的默认行为是使用物理单位来滚动其内容。但是,在 CanContentScroll 设置为 true 的情况下,内容可以使用逻辑单元进行滚动。例如,从 ItemsControl 继承的 ListBox、ListView 和其他控件使用逻辑单元进行滚动。如果 CanContentScroll 为 true,则 ExtentHeight、ScrollableHeight、ViewportHeight 和 VerticalOffset 属性的值是项目数,而不是物理单位。

如果您需要物理滚动而不是逻辑滚动,请将宿主 Panel 元素包装在 ScrollViewer 中并将其 CanContentScroll 属性设置为 false。物理滚动是大多数 Panel 元素的默认滚动行为。

因此,这基本上意味着您可以按像素滚动,也可以从集合中滚动整个项目。因此,为了平滑滚动,您需要使用像素进行滚动。为此,您只需将ScrollViewer.CanContentScroll属性设置为False. 所以事实证明,这毕竟是一个简单的修复。

于 2014-01-10T12:37:26.620 回答
1

不幸的是,设置ScrollViewer.CanContentScroll = False将禁用虚拟化,因此并不能真正帮助解决这个问题。

我发现为 TreeViewItem 的内容设置硬编码的高度值会使滚动条表现得更好,但滚动条仍然会调整大小。

于 2015-10-12T06:56:32.047 回答