É possível substituir o ItemsPresenter usar um Virtualizar o StackPanel, em vez de regular pilha painel?
-
14-11-2019 - |
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.
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>
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>