¿Es posible anular ItemsPresenter para usar un StackPanel virtualizador en lugar de un panel de pila normal?

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

Pregunta

Fondo

Tengo un control personalizado que hereda de TreeView y se modifica para mostrarse en un estilo de cuadrícula de datos.El problema que estoy viendo es con el rendimiento al expandir el árbol.Esto es común en mi investigación con Tree Views.Al inspeccionar las herramientas de rendimiento de WPF, noté que la clase ItemsPresenter usa un Stack Panel normal en lugar de un Stack Panel virtualizador.

enter image description here

Aquí está la sección de código donde se usa ScrollContentPresenter (que se muestra en la imagen).

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

Aquí está la plantilla que se pasa.

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

Pregunta

¿Es posible obligar al presentador de elementos a utilizar un panel de pila de virtualización?

Notas

  • Ya intenté envolver ItemsPresenter en un ScrollViewer pero eso da resultados no deseados (barras de desplazamiento para cada fila).
  • Codifiqué la opción CanContentScroll = true como prueba ya que esto deshabilita la virtualización cuando se establece en falso.
  • Este control está en producción y se utiliza en varios lugares, por lo que no tengo la opción de reemplazarlo, reescribirlo o realizar modificaciones importantes en el diseño en este momento.Solo estoy buscando anular esta sección si es posible.

Cualquier sugerencia u opción es muy apreciada.

Resuelto:

Modifiqué el estilo de la plantilla agregando esto al estilo y cambié los paneles de la pila a virtualización.

 <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
¿Fue útil?

Solución

try

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

o

<TreeView VirtualizingStackPanel.IsVirtualizing="True">

obviosuly Reemplace a TreeView, con su nombre de control de TreeView.

espero que ayude

paul

Otros consejos

Puede usar un VirtualizingStackPanel, sin embargo, tenga en cuenta que Hay más para virtualizar un PackPanel que solo usar un VirtualizingStackPanel

Aquí hay un ejemplo utilizando el código encontrado en el enlace publicado anteriormente, que enumera los elementos que se necesitan:

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

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