2013-02-10 60 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的內容設置一個硬編碼的高度值會使滾動條的行爲好很多,但滾動條仍然會調整一點。