我有一个带有以下属性的虚拟化TreeView:
<TreeView
ScrollViewer.CanContentScroll="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingStackPanel.ScrollUnit="Pixel"
VirtualizingStackPanel.CacheLength="20,20"
VirtualizingStackPanel.CacheLengthUnit="Item"
/>
...
</TreeView>
TreeViewItem的高度大致相同。
问题在于,向下滚动滚动条的手柄会改变大小并且滚动“跳跃”会导致用户体验非常糟糕。
如何获得更顺畅的用户体验?
答案 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的内容会使滚动条表现得更好,但滚动条仍然会调整大小。