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 a virtualização da interface do usuário, o que significa que a geração de contêiner de item e a computação de layout associada 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 vinculados a dados. TreeView a virtualização pode ser habilitada definindo a VirtualizingStackPanel.IsVirtualizing propriedade anexada como true. Se você quiser habilitar a virtualização da interface do usuário para controles personalizados que derivam de ItemsControl ou controles de item existentes que usam a classe StackPanel, como ComboBox, você pode definir 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. 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 Expander controle e o IsExpanded estado 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 é IsExpanded usado para o novo item. Além disso, o item antigo perde o valor correto IsExpanded .

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 aos controles que herdam de ItemsControl, é a reciclagem de contêineres, o que também pode melhorar o desempenho da 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. A reciclagem de contêiner permite que o controle reutilize os contêineres de itens existentes para diferentes 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.ItemsControl Você pode optar por habilitar a reciclagem de itens definindo a VirtualizationMode propriedade anexada como Recycling.

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

Suporte à virtualização bidirecional

VirtualizingStackPanel oferece suporte interno para virtualização da 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, LineUpe PageUpMouseWheelUp. 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, quando você cria um Button, você também obtém ClassicBorderDecorator e ContentPresenter objetos 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 a 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, o modo de exibição de 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 IsDeferredScrollingEnabled propriedade como true. IsDeferredScrollingEnabled é uma propriedade anexada e pode ser definida em ScrollViewer e em qualquer controle que tenha um ScrollViewer no seu template 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

Observação

Para ver um exemplo de como ativar a virtualização e a reutilização de contêineres em um TreeView, consulte Aprimorar o desempenho de um TreeView.

Consulte também