É possível substituir o ItemsPresenter usar um Virtualizar o StackPanel, em vez de regular pilha painel?

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

Pergunta

Fundo

Eu tenho um controle personalizado que herda de uma TreeView e é modificado para exibir em uma grade de dados de estilo.O problema que eu estou a ver é com o desempenho quando expandir a árvore.Isso é comum a partir de minha pesquisa com a Árvore de pontos de Vista.Após a inspeção com o Desempenho do WPF ferramentas notei que o ItemsPresenter aula regular Pilha de Painel, em vez de uma Pilha de Virtualização do Painel.

enter image description here

Aqui é a seção de código onde a ScrollContentPresenter é usado (mostrando na imagem).

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

Aqui é o modelo que está sendo transmitido.

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

Pergunta

É possível forçar os itens apresentador para usar uma pilha de virtualização painel?

Notas

  • Eu já tentei envolvendo o ItemsPresenter em um ScrollViewer mas que ocasione resultados indesejados (barras de rolagem para cada linha).
  • Eu codificado a opção CanContentScroll = true como um ensaio, uma vez que isto desactiva a virtualização quando sua definido para false.
  • Este controle está em produção e usado em vários lugares, então eu não tenho a opção para substituir / regravação / ou realizar grandes modificações para o projeto neste momento.Eu estou apenas olhando para substituir esta seção se possível.

Quaisquer sugestões ou opções são muito apreciados.

Resolvido:

Eu modificação de estilo do modelo adicionando este estilo e ele trocou a pilha de painéis para a virtualização.

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

Solução

Tente

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

ou

<TreeView VirtualizingStackPanel.IsVirtualizing="True">

Obviosuly substituir TreeView, com seu controle treeview nome.

Espero que ajude

Paulo

Outras dicas

Você pode usar um VirtualizingStackPanel, no entanto , esteja ciente de que há mais para virtualizar um StackPanel que usar apenas um VirtualizingStackPanel

Aqui está um exemplo usando o código encontrado no link postado acima, que lista os itens que são necessários:

<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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top