Partilhar via


Otimizando o desempenho: controles

O Windows Presentation Foundation (WPF) inclui muitos dos componentes comuns da interface do usuário (UI) que são usados na maioria dos aplicativos do Windows. Este tópico contém técnicas para melhorar o desempenho da interface do usuário.

Exibição de grandes conjuntos de dados

Controles WPF como o ListView e ComboBox são usados para exibir listas de itens em um aplicativo. Se a lista a ser exibida for grande, o desempenho do aplicativo poderá ser afetado. Isso ocorre porque o sistema de layout padrão cria um contêiner de layout para cada item associado ao controle de lista e calcula seu tamanho e posição de layout. Normalmente, você não precisa exibir todos os itens ao mesmo tempo; em vez disso, você exibe um subconjunto e o usuário rola pela lista. Nesse caso, faz sentido usar a UI virtualização, o que significa que a geração do contentor de item e o cálculo do layout associado para um item são adiados até que o item esteja visível.

A virtualização da interface do usuário é um aspeto importante dos controles de lista. A virtualização da interface do usuário não deve ser confundida com a virtualização de dados. A virtualização da interface do usuário armazena apenas itens visíveis na memória, mas em um cenário de vinculação de dados armazena toda a estrutura de dados na memória. Por outro lado, a virtualização de dados armazena apenas os itens de dados visíveis na tela na memória.

Por padrão, a virtualização da interface do usuário é habilitada para os controles ListView e ListBox quando seus itens de lista são vinculados a dados. A TreeView virtualização pode ser ativada definindo a propriedade anexada VirtualizingStackPanel.IsVirtualizing como true. Se desejar habilitar a virtualização da interface do usuário para controles personalizados que derivam de controles de item ItemsControl ou existentes que usam a classe StackPanel, como ComboBox, você pode definir o ItemsPanel como VirtualizingStackPanel e definir IsVirtualizing como true. Infelizmente, você pode desabilitar a virtualização da interface do usuário para esses controles sem perceber. A seguir está uma lista de condições que desabilitam a virtualização da interface do usuário.

Uma consideração importante ao virtualizar contêineres de item é se você tem informações de estado adicionais associadas a um contêiner de item que pertence ao item. Neste caso, deves guardar o estado adicional. Por exemplo, você pode ter um item contido em um controle Expander e o estado IsExpanded está vinculado ao contêiner do item e não ao item em si. Quando o contêiner é reutilizado para um novo item, o valor atual de IsExpanded é usado para o novo item. Além disso, o item antigo perde o valor IsExpanded correto.

Atualmente, nenhum controle WPF oferece suporte interno para virtualização de dados.

Reciclagem de contentores

Uma otimização para virtualização de interface do usuário adicionada no .NET Framework 3.5 SP1 para controles que herdam de ItemsControl é reciclagem de contêiner, que também pode melhorar o desempenho de rolagem. Quando um ItemsControl que usa a virtualização da interface do usuário é preenchido, ele cria um contêiner de item para cada item que rola para a exibição e destrói o contêiner de item para cada item que rola para fora da exibição. Reciclagem de contêineres permite que o controle reutilize os contêineres de itens existentes para vários itens de dados, de modo que os contêineres de itens não sejam constantemente criados e destruídos à medida que o usuário rola o ItemsControl. Você pode optar por habilitar a reciclagem de itens definindo a propriedade VirtualizationMode anexada como Recycling.

Qualquer ItemsControl que ofereça suporte à virtualização pode usar a reciclagem de contêineres. Para obter um exemplo de como habilitar a reciclagem de contêineres em um ListBox, consulte Melhorar o desempenho de rolagem de umListBox .

Suporte à virtualização bidirecional

VirtualizingStackPanel oferece suporte interno para virtualização de interface do usuário em uma direção, horizontal ou verticalmente. Se você quiser usar a virtualização bidirecional para seus controles, você deve implementar um painel personalizado que estende a classe VirtualizingStackPanel. A classe VirtualizingStackPanel expõe métodos virtuais como OnViewportSizeChanged, LineUp, PageUpe MouseWheelUp. Esses métodos virtuais permitem que você detete uma alteração na parte visível de uma lista e a trate de acordo.

Otimizando modelos

A árvore visual contém todos os elementos visuais em um aplicativo. Além dos objetos criados diretamente, ele também contém objetos devido à expansão do modelo. Por exemplo, ao criar um Button, você também obtém objetos ClassicBorderDecorator e ContentPresenter na árvore visual. Se você não otimizou seus modelos de controle, pode estar criando muitos objetos extras desnecessários na árvore visual. Para obter mais informações sobre a árvore visual, consulte Visão geral da renderização de gráficos do WPF .

Rolagem adiada

Por padrão, quando o usuário arrasta o polegar em uma barra de rolagem, a exibição de conteúdo é atualizada continuamente. Se a rolagem for lenta em seu controle, considere usar a rolagem adiada. Na rolagem adiada, o conteúdo é atualizado somente quando o usuário libera o polegar.

Para implementar a rolagem adiada, defina a propriedade IsDeferredScrollingEnabled como true. IsDeferredScrollingEnabled é uma propriedade anexada e pode ser definida em ScrollViewer e qualquer controle que tenha um ScrollViewer em seu modelo de controle.

Controles que implementam recursos de desempenho

A tabela a seguir lista os controles comuns para exibir dados e seu suporte a recursos de desempenho. Consulte as seções anteriores para obter informações sobre como habilitar esses recursos.

Controlo Virtualização Reciclagem de contentores Rolagem adiada
ComboBox Pode ser ativado Pode ser ativado Pode ser ativado
ContextMenu Pode ser ativado Pode ser ativado Pode ser ativado
DocumentViewer Não disponível Não disponível Pode ser ativado
ListBox Predefinido Pode ser ativado Pode ser ativado
ListView Predefinido Pode ser ativado Pode ser ativado
TreeView Pode ser ativado Pode ser ativado Pode ser ativado
ToolBar Não disponível Não disponível Pode ser ativado

Observação

Para obter um exemplo de como ativar a virtualização e a reciclagem de contentores em um TreeView, consulte Melhorar o desempenho de umTreeView.

Ver também