我在这里遇到一个问题,我想在 TreeView 中显示一些项目,大约 100.000 个元素。
如果我使用默认的 WPF TreeView,一切似乎都可以工作,但如果我使用自定义 TreeView(目前只有 ItemsControl),虚拟化似乎不再工作。
在网上研究时,我尝试了一些解决方案,但似乎都不起作用......
这是我的 xaml:
<Style TargetType="{x:Type my:MultiSelectionTreeView}">
<Setter Property="TreeView.Background" Value="Transparent"/>
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
<Setter Property="TreeView.OverridesDefaultStyle" Value="True" />
<Setter Property="ItemsControl.ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsItemsHost="True"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="TreeView.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type my:MultiSelectionTreeView}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer Focusable="True" CanContentScroll="true"
Padding="4"
VerticalScrollBarVisibility="Auto">
<ItemsPresenter HorizontalAlignment="Stretch"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这些项目位于带有 DataBinding 的 ObservableCollection 中,所以这不应该是问题......但它是什么???
Greets,
Jürgen
VirtualizingStackPanel 有一些特殊的代码来查找 TreeView 和 TreeViewItem。另外,TreeViewItem 实现VirtualizingStackPanel.IProvideStackingSize
,这是一个您无法实现的内部接口。
因此,如果您尝试复制 TreeView 中的项目的层次结构,那么您必须从 TreeView 派生才能使用虚拟化(而不是 ItemsControl)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)