我有一个包含大量嵌套数据的 WPF 树视图,我启用了虚拟化,它在加载数据方面起作用。但是滚动已经变得不稳定,直到整个视图滚动一次,然后它解决了一些(仍然不是很好(。我已经覆盖了ScrollViewer,我可以看到VirtualizingStackPanel中的范围高度在滚动时变化不规律。
有谁知道解决这个问题的方法?
任何帮助都值得赞赏。
树视图 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>
只有当ItemsPresenter
中的所有项目(并且TreeView
作为具有嵌套ItemsPresenters
ItemsPresenter
实现(具有相同的高度时,虚拟化才能正常工作。对于TreeView
通常不是这种情况。
这样做的主要原因是,因为它正在虚拟化,所以它必须估计某些本来可以精确测量的东西:
VirtualizationStackPanel
将假设所有子项的身高与当前可见的子项相同,并在此基础上估计所需的身高(而不是实际测量所有子项(,这将报告给ScrollViewer
,如果子项的高度可变,则此估计值可能会偏离,并且会根据滚动位置而变化, 导致不断调整滚动条的大小。