2013-02-10 52 views
0

我有这些性能的虚拟化的TreeView:TreeView的跳动滚动

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

TreeViewItem的大致相同的高度。

问题是,当向下滚动滚动条的句柄更改大小和滚动是“跳动”,这导致相当差的用户体验。

如何获得更平滑的用户体验?

+0

到目前为止,我的结论是TreeView几乎不可能提高性能。所以我会用listview/box来模拟treeview行为。太糟糕了。 – 2013-02-15 21:08:35

回答

1

我意识到这是旧的文章,你可能有一个解决方案现在,但它有一个简单的答案,这样的人谁可能会遇到这样的未来,那就是:

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

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

如果您需要物理滚动,而不是逻辑滚动,换主机面板元件在一个ScrollViewer中及其Ca​​nContentScroll属性设置为false。物理滚动是大多数面板元素的默认滚动行为。

所以,这基本上意味着你可以以像素为单位,或从集合整个项目而言滚动。因此,要平滑滚动,您需要使用像素进行滚动。要做到这一点,您只需将ScrollViewer.CanContentScroll属性设置为False即可。所以事实证明,这毕竟是一个简单的解决方案。

+0

我似乎还记得这样做 - 调整所有这些设置,看看我们是否可以同时获得性能和平滑滚动。不过,现在是一段时间了,所以我实在不记得了。我们切换到使用ListView并模拟树的行为,这当然有点难过。我会就此进行跟进,以确保我们不会错过任何... – 2014-01-13 21:44:52

0

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

我发现为TreeViewItem的内容设置一个硬编码的高度值会使滚动条的行为好很多,但滚动条仍然会调整一点。