如果按如下所示设置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中)
问题在于样式。经过一些研究,我们发现在App.xaml(或等效项)中有一种针对TreeView的未命名样式(即具有DataType={x:Type TreeView}
而没有x:Key
的样式)和一种针对TreeViewItem
的样式。它覆盖了ControlTemplate
分别。
这些样式没有将ItemsPanel
设置为VirtualizingStackPanel
的触发器,也没有提及任何虚拟化。删除样式后,TreeView可以正常工作。即使本地属性在ItemsPanel
上设置了VirtualizingStackPanel.Isvirtualizing="True"
和TreeView
,这些属性也没有传播到TreeViewItems
,因此TreeView的顶层将被虚拟化,而子类别则不会被虚拟化(因为它们的虚拟化行为取决于TreeViewItem
)
有同样的问题。就我而言,TreeView的初始大小不受限制(TreeView在弹出窗口中)。因此,虚拟化面板首次初始化了所有控件。
将TreeView的MaxHeigt设置为1000可以解决此问题。