Treeview虚拟化和不稳定的滚动

时间:2017-02-09 09:36:18

标签: wpf treeview scrollbar

我有一个WPF树视图,其中包含大量嵌套数据,我已启用虚拟化,这对于正在加载的数据而言是有效的。但滚动已经变得不稳定,直到整个视图滚动一次然后它解决了一些(仍然不是很好)。我已经覆盖了ScrollViewer,我可以看到VirtualizingStackPanel中的范围高度在滚动时发生了不正常的变化。

有谁知道解决这个问题的方法?

任何帮助都是相关的。

下面的TreeView Xaml的相关部分:

        <TreeView  ItemsSource="{Binding Folders.ObservableTree}" Name="FoldersTreeView"
                AutomationProperties.AutomationId="foldersview_treeview_folders" TabIndex="0" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown"
                VirtualizingStackPanel.CleanUpVirtualizedItem="VirtualizingStackPanel_OnCleanUpVirtualizedItem" 
                ScrollViewer.VerticalScrollBarVisibility="Auto"
                ScrollViewer.IsDeferredScrollingEnabled ="True"
                VirtualizingStackPanel.IsVirtualizing="True"
                ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                VirtualizingStackPanel.ScrollUnit="Pixel"
                VirtualizingStackPanel.VirtualizationMode="Standard"
                VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
                VirtualizingStackPanel.CacheLengthUnit="Item">

        <TreeView.ItemsPanel>
                <ItemsPanelTemplate>
                <VirtualizingStackPanel IsItemsHost="True" CanVerticallyScroll="True"/>
            </ItemsPanelTemplate>
            </TreeView.ItemsPanel>
        <TreeView.Template>
            <ControlTemplate>
                <view:ScrollViewer2 Padding="{TemplateBinding Control.Padding}" Focusable="False" Name="TreeViewScrollViewer"  
                              CanContentScroll="True">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                </view:ScrollViewer2>
            </ControlTemplate>
        </TreeView.Template>

1 个答案:

答案 0 :(得分:0)

如果ItemsPresenter(和TreeView中的所有项目都实现为嵌套ItemsPresenter的{​​{1}}具有相同的高度,则虚拟化才有效。使用ItemsPresenters通常不是这种情况。

这样做的主要原因是因为它是虚拟化的,所以它必须估计它本来会测量的某些东西:

TreeView将假设所有孩子都与当前可见的孩子具有相同的身高,并将根据此估计所需的身高(而不是实际测量所有孩子),这将报告给{{1} },如果孩子的高度可变,这个估计可能会偏离,并会根据滚动位置而改变,从而导致不断调整滚动条的大小。