6

如果 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 中)

4

2 回答 2

7

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

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

于 2010-11-25T04:20:50.693 回答
1

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

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

于 2020-04-26T10:03:48.833 回答