WPF:TreeView虚拟化无法正常工作

时间:2010-11-22 00:18:58

标签: wpf treeview virtualization ui-virtualization

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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