VirtualizingStackPanel на дереве не является виртуализацией

2

У меня проблема, я хочу показать некоторые элементы в TreeView, около 100.000 элементов. Если я использую WPF TreeView по умолчанию, все работает, но если я использую custom-TreeView (на данный момент это только ItemControl), виртуализация больше не работает. Во время исследования через Интернет я пробовал некоторые решения, но никто из них, похоже, не работает... Здесь мой 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>

Элементы находятся в ObservableCollection с DataBinding, поэтому это не должно быть проблемой... но что это такое?

Приветствия,

Юрген

Теги:
wpf
treeview
virtualizingstackpanel

1 ответ

2
Лучший ответ

В VirtualizingStackPanel есть специальный код, который ищет TreeView и TreeViewItem. Кроме того, TreeViewItem реализует VirtualizingStackPanel.IProvideStackingSize, который является внутренним интерфейсом, который вы не сможете реализовать.

Итак, если вы пытаетесь реплицировать иерархическую структуру элементов, как в TreeView, тогда вам нужно будет извлечь из TreeView для использования виртуализации (а не ItemsControl).

  • 0
    Гммм, все возможно, но если вы посмотрите достаточно глубоко, тогда будет так много несоответствий и ограничений ... Ну, так и быть. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню