WPF: Como melhorar a performance da AutoCompleteBox com um simples truque

Por omissão a AutoCompleteBox não usa virtualização da interface, por isso com muitos itens a performance vai ser fraca e a vossa aplicação pode mesmo congelar.

Para perceber a solução que se segue, é necessário conhecer o template usado pela AutoCompleteBox.

A AutoCompleteBox usa uma ListBox para mostrar os resultados. A ListBox suporta virtualização, mas como não tem uma MaxHeight definida, vão ser criados elementos de visualização para todos os itens, mesmo os que não são mostrados.

Com este simples estilo forçamos uma MaxHeight à ListBox interna e certificamos que a virtualização é usada:

<Style x:Key="AutoCompleteBoxStyle" TargetType="{x:Type toolkit:AutoCompleteBox}">
    <Style.Resources>
        <Style TargetType="{x:Type ListBox}">
            <Setter Property="MaxHeight" Value="200" />
        </Style>
    </Style.Resources>
</Style>

Usa-se como qualquer outro estilo:

<toolkit:AutoCompleteBox
    Style="{StaticResource AutoCompleteBoxStyle}"
    ItemsSource="{Binding ItemCollection}" />

Como podem ver, criamos um estilo interno ao estilo da AutoCompleteBox e fazemos o target à ListBox por tipo. Isto serve para o nosso caso, porque o template default só tem uma ListBox e assim não temos de redefinir todo o template.

Há outras alternativas para melhorar a performance da AutoCompleteBox:

  • Redefinir o template da AutoCompleteBox e definir directamente a MaxHeight no controlo ListBox (resultado similar ao de cima).
  • Mudar a propriedade MinimumPrefixLength para um valor maior. Só serão mostrados resultados depois de serem escritos um certo número de caracteres.
  • Correr a pesquisa do autocomplete em background implementando o evento Populating.
  • Limitar o total de resultados que são mostrados implementando um AutoCompleteFilterPredicate e usando a propriedade ItemFilter.
Nuno Freitas
Publicado por Nuno Freitas em 23 abril, 2014

Artigos relacionados