質問

ここで問題があります。ツリービューで、約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から派生する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top