VirtualizingStackPanel上的树视图列表不虚拟化

本文关键字:列表 虚拟化 视图 VirtualizingStackPanel | 更新日期: 2023-09-27 17:53:38

我在这里遇到了一个问题,我想在TreeView中显示一些项目,大约100,000个元素。如果我使用默认的WPF TreeView,一切似乎都可以工作,但如果我使用自定义TreeView(目前只有ItemsControl),虚拟化似乎不再工作了。在网上研究时,我尝试了一些解决方案,但似乎没有一个奏效……这是我的xaml:

<Style TargetType="{x:Type my:MultiSelectionTreeView}">
    <Setter Property="TreeView.Background" Value="Transparent"/>
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
    <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
    <Setter Property="TreeView.OverridesDefaultStyle" Value="True" />
    <Setter Property="ItemsControl.ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="TreeView.Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type my:MultiSelectionTreeView}">
                <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                    <ScrollViewer Focusable="True" CanContentScroll="true" 
                                  Padding="4" 
                                  VerticalScrollBarVisibility="Auto">
                        <ItemsPresenter HorizontalAlignment="Stretch"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

项目是在一个ObservableCollection与数据绑定,所以这应该不是问题…但它是什么??

问候,

Jurgen

VirtualizingStackPanel上的树视图列表不虚拟化

VirtualizingStackPanel有一些特殊的代码来查找TreeView和TreeViewItem。此外,TreeViewItem实现了VirtualizingStackPanel.IProvideStackingSize,这是一个内部接口,你将无法实现。

因此,如果你想复制项目的层次结构,就像在TreeView中一样,那么你必须从TreeView中派生出虚拟化(而不是ItemsControl)。