VirtualizingStackpanel上のstackpanelは仮想化されていません
-
27-10-2019 - |
質問
ここで問題があります。ツリービューで、約100.000の要素にいくつかのアイテムを見せたいと思います。デフォルトのWPF 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>
アイテムはデータバインディングとの観察的な収集にあるので、それは問題ではないはずです...しかし、それは何ですか?
挨拶、
ユルゲン
解決
VirtualizingStackPanelには、TreeViewとTreeViewItemを探した特別なコードがあります。さらに、TreeViewItemは実装しています VirtualizingStackPanel.IProvideStackingSize
, 、これは、実装できない内部インターフェイスです。
したがって、TreeViewのようなアイテムの階層構造を複製しようとしている場合は、仮想化(ItemsControlではなく)を使用するためにTreeViewから派生する必要があります。
所属していません StackOverflow