Domanda

ho un problema qui, voglio mostrare alcuni oggetti in un TreeView, circa 100.000 elementi. Se io uso l'impostazione predefinita WPF TreeView tutto sembra funzionare, ma se io uso una custom-TreeView (che è al momento solo un ItemsControl), la virtualizzazione non sembra funzionare più. Mentre la ricerca sul web, ho provato alcune soluzioni, ma nessuno di loro sembra funzionare ... Ecco il mio 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>

I prodotti che si trovano in un'ObservableCollection con DataBinding, in modo che non dovrebbe essere il problema ... ma che cos'è ???

saluta,

Jürgen

È stato utile?

Soluzione

Il VirtualizingStackPanel ha qualche codice speciale che cerca TreeView e TreeViewItem. Inoltre, implementa TreeViewItem VirtualizingStackPanel.IProvideStackingSize, che è un'interfaccia interna, che non sarà in grado di attuare.

Quindi, se si sta cercando di replicare la struttura gerarchica di oggetti come nel controllo TreeView, allora si avrebbe dovuto derivare da TreeView a utilizzare la virtualizzazione (non ItemsControl).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top