WPF:TreeView虚拟化未生效

6
如果按照以下设置,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>

我有一个TreeView没有进行虚拟化,当我展开节点(并使用Snoop检查)时,我发现所有的TreeViewItems都被创建了。我想知道是否有一些容器的组合可以防止TreeView对其内容进行虚拟化。(例如在StackPanel中托管它)


这篇文章可能对虚拟化定制有所帮助:https://dev59.com/n3VC5IYBdhLWcg3w-mZO - Domokun
2个回答

7
问题出在样式上。经过一番研究,我们发现有一个未命名的样式针对 TreeView(即使用 DataType={x:Type TreeView} 但没有 x:Key)和一个针对 App.xaml(或等效文件)中的 TreeViewItem。它们分别覆盖了每个的 ControlTemplate
这些样式没有触发器来设置 ItemsPanelVirtualizingStackPanel,也没有提到任何虚拟化。当移除这些样式后,TreeView 就正常工作了。尽管本地属性设置了 ItemsPanelVirtualizingStackPanel.Isvirtualizing="True"TreeView 上,但这些属性并没有传播到 TreeViewItems,因此 TreeView 的顶层会虚拟化,而子类别则不会(因为它们的虚拟化行为取决于 TreeViewItem)。

2

我遇到了同样的问题。在我的情况下,TreeView的初始大小没有限制(TreeView位于弹出窗口中)。因此,虚拟化面板第一次初始化了所有控件。

将TreeView的MaxHeight设置为1000解决了这个问题。


添加虚拟化,如 IsVirtualization = true 和 Mode = Recycle,并在树形视图中设置最大高度。这样,在我的情况下它就可以完美地工作了。谢谢。 - Pargat Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接