Pregunta

Tengo un problema aquí, quiero mostrar algunos elementos en una vista de árbol, alrededor de 100,000 elementos. Si uso el WPF TreeView predeterminado, todo parece funcionar, pero si uso una vista de Treeview (que es en este momento solo un itemscontrol), la virtualización ya no parece funcionar. Mientras investigaba en la web, he probado algunas soluciones, pero ninguna de ellas parece funcionar ... aquí está mi 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>

Los ítems están en una manera observable con databinding, por lo que ese no debería ser el problema ... pero ¿qué es?

Saluda,

Jürgen

¿Fue útil?

Solución

VirtualizingStackPanel tiene un código especial que busca TreeView y TreeViewitem. Además, TreeViewitem implementa VirtualizingStackPanel.IProvideStackingSize, que es una interfaz interna que no podrá implementar.

Entonces, si está intentando replicar la estructura jerárquica de elementos como en TreeView, entonces tendría que derivar de TreeView para usar la virtualización (no itemScontrol).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top