Monday, March 7, 2011

Dica de desempenho em WPF TreeView

Eu tive problema quando usei costume TreeView com costume TreeViewItem.
Quando o data binding executou, o Tree criou todos os itens no mesmo tempo – o que causou o CPU alto, muita memória , e a tela que teve o TreeView não estava respondendo por alguns segundos.
No fim da minha pesquisa eu achei que:
O VS 2010 profiler não ajudou e não achou a razão do problema, ele apontou para MeasureOverride método  do que a razão verdadeira que foi que eu deletei um trigger no xaml style do custom TreeViewItem -  e isso não deixou a virtualização do TreeView funcionar normal.
A falta de virtualização forçou o Tree criar todos os TreeViewItems quando o data binding para o ItemsSource mudou.

Reparação:
No xaml que contém  a declaração do TreeViewItem (ou class que herdar ele):
Na linha que começa assim :
<Style TargetType="{x:Type TreeViewItem}">
dentro do triggers que começa assim:
<ControlTemplate.Triggers>
as seguintes linhas não podem remover, ou, podem usar outro multi trigger que causa o mesmo resultado:
<Trigger Property="IsExpanded" Value="false">
    <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
</Trigger>
Com essas linhas, o TreeView não vai criar todos filhos/netos até o usuário vai expandir os items "pais" primeiro.
Isso pode fazer os desempenhos muito mais rápido.

1 comment:

  1. Hello, Viviane.

    The excellent and lovely work.

    The autumn profound, painted space

    The prayer for all peace.
    from Japan, ruma ❋

    ReplyDelete