Ist es möglich, den ItemsPresenter zu überschreiben, um ein virtualisierendes StackPanel anstelle eines regulären Stack-Panels zu verwenden?

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

Frage

Hintergrund

Ich habe ein benutzerdefiniertes Steuerelement, das von einer TreeView erbt und so geändert wird, dass es im Datenrasterstil angezeigt wird.Das Problem, das ich sehe, ist die Leistung beim Erweitern des Baums.Dies ist bei meinen Untersuchungen mit Baumansichten üblich.Bei der Überprüfung mit den WPF-Leistungstools ist mir aufgefallen, dass die ItemsPresenter-Klasse ein reguläres Stack-Panel anstelle eines virtualisierenden Stack-Panels verwendet.

enter image description here

Hier ist der Codeabschnitt, in dem der ScrollContentPresenter verwendet wird (im Bild dargestellt).

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

Hier ist die Vorlage, die übergeben wird.

    <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>

Frage

Ist es möglich, den Artikelpräsentator zu zwingen, ein virtualisierendes Stapelpanel zu verwenden?

Anmerkungen

  • Ich habe bereits versucht, den ItemsPresenter in einen ScrollViewer einzuschließen, aber das führt zu unerwünschten Ergebnissen (Bildlaufleisten für jede Zeile).
  • Ich habe die Option CanContentScroll = true als Test fest codiert, da diese die Virtualisierung deaktiviert, wenn sie auf „false“ gesetzt ist.
  • Dieses Steuerelement befindet sich in der Produktion und wird an mehreren Stellen verwendet, sodass ich zu diesem Zeitpunkt keine Möglichkeit habe, das Design zu ersetzen, neu zu schreiben oder größere Änderungen am Design vorzunehmen.Ich versuche nur, diesen einen Abschnitt nach Möglichkeit zu überschreiben.

Für Vorschläge oder Optionen sind wir sehr dankbar.

Gelöst:

Ich habe den Stil der Vorlage geändert, indem ich dies zum Stil hinzugefügt habe, und die Stapelfenster wurden auf Virtualisierung umgestellt.

 <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
War es hilfreich?

Lösung

versuchen Sie generasacodicetagpre.

oder generasacodicetagpre.

Deviosuly Ersetzen von TreeView, mit dem Namen des TreeView-Steuernamens.

hoffe das hilft

paul

Andere Tipps

Sie können a verwenden VirtualizingStackPanel, aber seien Sie sich dessen bewusst Zur Virtualisierung eines StackPanels gehört mehr als nur die Verwendung eines VirtualizingStackPanel

Hier ist ein Beispiel mit dem Code aus dem oben geposteten Link, der die benötigten Elemente auflistet:

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top