È possibile sovrascrivere gli articoliSpresenter per utilizzare uno stackpanel virtualizzante anziché un pannello di stack regolare?

StackOverflow https://stackoverflow.com/questions/9503433

Domanda

Sfondo

Ho un controllo personalizzato che eredita da un tralesw e viene modificato per visualizzare in uno stile di rete dati. Il problema che vedo è con le prestazioni quando si espande l'albero. Questo è comune dalla mia ricerca con vista sull'albero. All'ispezione con gli strumenti delle prestazioni del WPF ho notato che la classe ProSerienter utilizza un pannello di stack regolare anziché un pannello di pila virtualizzante.

Inserisci Descrizione dell'immagine qui

Ecco la sezione del codice in cui viene utilizzato il ScrollContentPresenter (mostra nell'immagine).

<ScrollContentPresenter Name="PART_ScrollContentPresenter"
      KeyboardNavigation.DirectionalNavigation="Local"
      Content="{TemplateBinding Content}"
      ContentTemplate="{TemplateBinding ContentTemplate}"
      CanContentScroll="{TemplateBinding CanContentScroll}"
      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
.

Ecco il modello è passato.

    <ControlTemplate TargetType="CommonControls:TreeListViewItem508">
    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Border x:Name="item">
            <Border Name="InnerBorder">
                <Grid Style="{StaticResource GridBackgroundStyle}">
                    <Rectangle Visibility="Collapsed" Fill="#75FFFFFF" Name="UpperHighlight" />
                </Grid>
            </Border>
        </Border>
        <ItemsPresenter Grid.Row="1" Name="ItemsHost" />
    </Grid>
</ControlTemplate>
.

Domanda

È possibile forzare il presentazione degli articoli per utilizzare un pannello di pila virtualizzante?

Notes

    .
  • Ho già provato a avvolgere gli elementiSpresenter in uno scrollviewer ma che fornisce risultati indesiderati (barre di scorrimento per ogni riga).
  • I hard codificata l'opzione cANCONTENTSCROLL= TRUE come test poiché questo disabilita la virtualizzazione quando è impostata su false.
  • Questo controllo è in produzione e utilizzato in più luoghi, quindi non ho la possibilità di sostituire / riscrivere / eseguire modifiche principali al design a questo punto. Sto solo cercando di ignorare questa sezione se possibile.

    Qualsiasi suggerimento o opzione sono molto apprezzati.

    Risolto:

    Ho modificato lo stile del modello aggiungendolo allo stile e ha commutato i pannelli dello stack per virtualizzare.

     <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    
    .

È stato utile?

Soluzione

Prova

      <TreeView>
        <TreeView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel/>
            </ItemsPanelTemplate>
        </TreeView.ItemsPanel>
    </TreeView>
.

o

<TreeView VirtualizingStackPanel.IsVirtualizing="True">
.

Ovviamente sostituire TreeView, con il tuo nome di controllo TreeView.

Spero che aiuti

Paul

Altri suggerimenti

È possibile utilizzare un VirtualizingStackPanel, tuttavia essere consapevole del fatto che c'è di più per virtualizzare uno stackpanel che solo usando un VirtualizingStackPanel .

Ecco un esempio utilizzando il codice trovato nel collegamento pubblicato sopra che elenca gli elementi necessari:

<ItemsControl ...
    VirtualizingStackPanel.IsVirtualizing="True" <!-- this is needed -->
    ScrollViewer.CanContentScroll="True" > <!-- this is needed -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />  <!-- this is needed -->
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate>
            <Border ...>
                <ScrollViewer> <!-- this is needed -->
                    <ItemsPresenter />
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>
.

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