Compartilhar via


Otimizando o desempenho: controles

O WPF (Windows Presentation Foundation) inclui muitos dos componentes comuns da interface do usuário (interface do usuário) 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.

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 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 virtualização , o que significa que a geração do contêiner de item e a computação do layout associado para 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 apenas 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. 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 associados a dados. TreeView virtualização pode ser habilitada definindo a propriedade anexada VirtualizingStackPanel.IsVirtualizing como true. Se você quiser 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 para VirtualizingStackPanel e definir IsVirtualizing como true. Infelizmente, você pode desabilitar a virtualização da interface do usuário para esses controles sem perceber. Veja a seguir uma lista de condições que desabilitam a virtualização da interface do usuário.

Uma consideração importante ao virtualizar 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ê deve salvar o estado adicional. Por exemplo, você pode ter um item contido em um controle Expander e o estado IsExpanded está associado 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 do WPF oferece suporte interno para virtualização de dados.

Reciclagem de contêiner

Uma otimização para a virtualização da interface do usuário adicionada no .NET Framework 3.5 SP1 para controles herdados de ItemsControl é reciclagem de contêineres, que também podem melhorar o desempenho da rolagem. Quando um ItemsControl que usa a virtualização da interface do usuário é populado, ele cria um contêiner de item para cada item que rola à exibição e destrói o contêiner de item para cada item que rola fora de exibição. A reciclagem de contêineres permite que o controle reutilize os contêineres de itens existentes para diferentes itens de dados, para que os contêineres de itens não sejam criados e destruídos constantemente à 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 ItemsControl que dê 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, deverá implementar um painel personalizado que estenda a classe VirtualizingStackPanel. A classe VirtualizingStackPanel expõe métodos virtuais como OnViewportSizeChanged, LineUp, PageUpe MouseWheelUp. Esses métodos virtuais permitem detectar uma alteração na parte visível de uma lista e tratá-la adequadamente.

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 tiver otimizado seus modelos de controle, talvez esteja criando muitos objetos desnecessários extras 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 indicador em uma barra de rolagem, o conteúdo é atualizado continuamente. Se a rolagem estiver lenta no 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.

Controle Virtualização Reciclagem de contêiner 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

Nota

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

Consulte também