WPF:TreeView虚拟化不起作用

问题描述 投票:6回答:2

如果按如下所示设置TreeView,什么可以阻止TreeView虚拟化?

<TreeView 
    ItemsSource="{Binding}" 
    VirtualizingStackPanel.IsVirtualizing="True">
    <TreeView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </TreeView.ItemsPanel>
    <TreeView.ItemContainerStyle>
        <Style
            TargetType="{x:Type TreeViewItem}">
            <Setter
                Property="IsExpanded"
                Value="{Binding IsExpanded, Mode=TwoWay}"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

我有一个没有进行虚拟化的扩展,当我扩展节点(并使用snoop进行检查)时,我已经创建了所有TreeViewItems。我想知道是否有某种容器组合会阻止TreeView虚拟化其内容。 (例如,将其托管在StackPanel中)

wpf treeview virtualization ui-virtualization
2个回答
6
投票

问题在于样式。经过一些研究,我们发现在App.xaml(或等效项)中有一种针对TreeView的未命名样式(即具有DataType={x:Type TreeView}而没有x:Key的样式)和一种针对TreeViewItem的样式。它覆盖了ControlTemplate分别。

这些样式没有将ItemsPanel设置为VirtualizingStackPanel的触发器,也没有提及任何虚拟化。删除样式后,TreeView可以正常工作。即使本地属性在ItemsPanel上设置了VirtualizingStackPanel.Isvirtualizing="True"TreeView,这些属性也没有传播到TreeViewItems,因此TreeView的顶层将被虚拟化,而子类别则不会被虚拟化(因为它们的虚拟化行为取决于TreeViewItem


0
投票

有同样的问题。就我而言,TreeView的初始大小不受限制(TreeView在弹出窗口中)。因此,虚拟化面板首次初始化了所有控件。

将TreeView的MaxHeigt设置为1000可以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.