TreeView跳跃滚动

时间:2013-02-10 14:15:32

标签: wpf scroll treeview virtualization ui-virtualization

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

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

TreeViewItem的高度大致相同。

问题在于,向下滚动滚动条的手柄会改变大小并且滚动“跳跃”会导致用户体验非常糟糕。

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

2 个答案:

答案 0 :(得分:1)

我意识到这是一篇很老的帖子,你现在可能有一个解决方案,但它有一个简单的答案,所以对于将来可能会遇到这个问题的人来说,这里是:

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

  

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

     

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

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

答案 1 :(得分:0)

不幸的是,设置ScrollViewer.CanContentScroll = False会禁用虚拟化,因此无法真正解决此问题。

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