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 de sua interface do usuário.

Exibindo 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 computa a posição e tamanho do 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 virtualização da interface do usuário, o que significa que a geração de contêiner do item e a computação do layout associado a um item são adiadas até que o item esteja visível.

A virtualização da interface do usuário é um aspecto 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 somente os itens visíveis na memória, mas em um cenário de associação de dados, armazena toda a estrutura de dados na memória. Em contraste, a virtualização de dados armazena somente 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 e ListBox quando seus itens de lista são vinculados a ListView dados. TreeView A virtualização pode ser habilitada definindo a propriedade anexada VirtualizingStackPanel.IsVirtualizing como true. Se desejar habilitar a virtualização da interface do usuário para controles personalizados derivados de ou controles de ItemsControl item existentes que usam a StackPanel classe, como , você poderá definir o ItemsPanel para VirtualizingStackPanel e definir IsVirtualizing como ComboBoxtrue. Infelizmente, você pode desabilitar a virtualização da interface do usuário para esses controles sem perceber. A seguir, temos uma lista de condições que desabilitam a virtualização da interface do usuário.

Uma consideração importante quando você virtualiza contêineres de itens é se você tem informações de estado adicionais associadas a um contêiner de item que pertence ao item. Nesse caso, você precisa salvar o estado adicional. Por exemplo, você pode ter um item contido em um Expander controle e o IsExpanded estado 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 correto IsExpanded .

Atualmente, nenhum controle do WPF dá suporte interno para a virtualização de dados.

Reciclagem de contêineres

Uma otimização para a virtualização da interface do usuário adicionada no .NET Framework 3.5 SP1 para controles que herdam de é a reciclagem de contêiner, que também pode melhorar o desempenho de ItemsControl rolagem. Quando um que usa virtualização de interface do usuário é preenchido, ele cria um ItemsControl 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. A reciclagem de contêiner permite que o controle reutilize os contêineres de item existentes para itens de dados diferentes, para que os contêineres de item 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 anexada VirtualizationMode como Recycling.

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

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, deverá implementar um painel personalizado que estenda a VirtualizingStackPanel classe. A VirtualizingStackPanel classe expõe métodos virtuais como OnViewportSizeChanged, , LineUpPageUpe MouseWheelUp. Esses métodos virtuais permitem detectar uma alteração na parte visível de uma lista e manipulá-la de acordo.

Otimizando modelos

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

Rolagem adiada

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

Para implementar a rolagem adiada, defina a IsDeferredScrollingEnabled propriedade como true. IsDeferredScrollingEnabled é uma propriedade anexada e pode ser definida em e qualquer controle que tenha um em ScrollViewer seu modelo de ScrollViewer 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.

Control Virtualization Reciclagem de contêineres Rolagem adiada
ComboBox Pode ser habilitado Pode ser habilitado Pode ser habilitado
ContextMenu Pode ser habilitado Pode ser habilitado Pode ser habilitado
DocumentViewer Não disponível Não disponível Pode ser habilitado
ListBox Padrão Pode ser habilitado Pode ser habilitado
ListView Padrão Pode ser habilitado Pode ser habilitado
TreeView Pode ser habilitado Pode ser habilitado Pode ser habilitado
ToolBar Não disponível Não disponível Pode ser habilitado

Observação

Para obter um exemplo de como habilitar a virtualização e a reciclagem de contêineres em um , consulte Melhorar o desempenho de um TreeViewTreeView.

Confira também