Otimização de desempenho: Controles
Windows Presentation Foundation (WPF)inclui vários componentes de interface do usuário (UI) comuns 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.
Este tópico contém as seguintes seções.
- Exibindo grandes conjuntos de dados
- Reciclagem de contêiner
- Suporte virtualização de bidirecional
- Modelos de otimização
- Foi adiado de rolagem
- Controla que recursos de desempenho de implementar
- Tópicos relacionados
Exibindo grandes conjuntos de dados
Controles do WPF como o ListView e ComboBox são usados para exibir listas de itens em um aplicativo. Se a lista para exibir for grande, o desempenho do aplicativo pode ser afetado. Isso é porque o sistema de layout padrão cria um contêiner de layout para cada item associado ao controle de lista e calcula o tamanho do layout e a posição. Normalmente, você não tem que exibir todos os itens ao mesmo tempo; em vez disso você exibe um subconjunto e o usuário rola a lista. Nesse caso, faz sentido usar a interface do usuário virtualização, que significa que a geração de contêiner do item e associados a computação de layout para um item é adiado até que o item está visível.
A virtualização de interface do usuário é um aspecto importante dos controles de lista. Virtualização de interface do usuário não deve ser confundida com a virtualização de dados. UI virtualização armazena somente itens visíveis na memória, mas em um cenário de vinculação de dados armazena a estrutura de dados inteira na memória. Em contraste, a virtualização de dados armazena os itens de dados que são visíveis na tela na memória.
Por padrão, a virtualização de interface do usuário está habilitada para o ListView e ListBox controla quando seus itens de lista são vinculados a dados. TreeViewa virtualização pode ser ativada definindo a VirtualizingStackPanel.IsVirtualizing anexado propriedade para true. Se você deseja habilitar a virtualização de interface do usuário para controles personalizados que derivam de ItemsControl ou controles de item existente que usam o StackPanel de classe, como ComboBox, você pode definir a ItemsPanel para VirtualizingStackPanel e defina IsVirtualizing para true. Infelizmente, você pode desativar a virtualização de interface do usuário para esses controles sem perceber. Veja a seguir uma lista de condições que desativar a virtualização de interface do usuário.
Contêineres de itens são adicionados diretamente para o ItemsControl. Por exemplo, se um aplicativo explicitamente adiciona ListBoxItem objetos para um ListBox, o ListBox não virtualizar o ListBoxItem objetos.
Setting CanContentScroll to false.
Setting IsVirtualizing to false.
Usando o agrupamento de item.
Atualmente, os controles do WPF oferecem suporte interno para virtualização de dados.
Reciclagem de contêiner
Uma otimização para a virtualização de interface do usuário adicionada a.NET Framework 3.5 SP1 para controles que herdam de ItemsControl é reciclagem de contêiner, que também pode melhorar o desempenho da rolagem. Quando um ItemsControl que usa a virtualização de interface do usuário estiver preenchida, ele cria um contêiner de item para cada item que rola no modo de exibição e destrói o contêiner de item para cada item que rola de exibição. Reciclagem de contêiner permite que o controle reutilizar os contêineres de item existentes para os itens de dados diferentes, para que os recipientes de item são criados e destruídos como o usuário rolar não constantemente a ItemsControl. Você pode optar por ativar o item de reciclagem, definindo a VirtualizationMode para Recycling.
Reciclagem de contêiner não é usado se qualquer um dos casos a seguir forem verdadeiras:
Contêineres de itens são adicionados diretamente para o ItemsControl. Por exemplo, ListBoxItem os objetos são adicionados diretamente a uma ListBox de controle.
Item recipientes de ItemsControl são de tipos diferentes. Por exemplo, um Menu que usa Separator objetos não podem implementar a reciclagem de item porque o Menu contém os objetos do tipo Separator e MenuItem.
Uma consideração importante quando você recicla contêineres de item é 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 é vinculado ao contêiner do item e não no próprio item. 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 correto IsExpanded valor.
Qualquer ItemsControl que ofereça suporte a 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 Como: Melhorar o desempenho de rolagem de uma caixa de listagem..
Suporte virtualização de bidirecional
VirtualizingStackPaneloferece suporte interno para virtualização de interface do usuário em uma direção, horizontal ou verticalmente. Se você quiser usar virtualização de bidirecional para seus controles, você deve implementar um painel personalizado que estende o VirtualizingStackPanel classe. O VirtualizingStackPanel classe expõe métodos virtuais, como OnViewportSizeChanged, LineUp, PageUp, e MouseWheelUp.Esses métodos virtuais permitem detectar uma alteração na parte visível de uma lista e manipulá-lo adequadamente.
Modelos de otimização
A árvore visual contém todos os elementos visuais em um aplicativo. Além os objetos criados diretamente, ele também contém objetos devido à expansão do modelo. Por exemplo, quando você cria um Button, mas também ClassicBorderDecorator e ContentPresenter objetos na árvore visual. Se você ainda não otimizados seus modelos de controle, você pode criar muitos objetos desnecessários extra na árvore visual. Para obter mais informações sobre a árvore visual, consulte WPF Graphics Rendering Overview.
Foi adiado de rolagem
Por padrão, quando o usuário arrasta o controle deslizante na barra de rolagem, o modo de exibição de conteúdo atualiza continuamente. Se a rolagem é lento no seu controle, considere a possibilidade de uso adiado de rolagem. Na rolagem retardada, o conteúdo é atualizado somente quando o usuário libera o thumb.
Para implementar a rolagem adiada, defina a IsDeferredScrollingEnabled propriedade para true. IsDeferredScrollingEnabledé uma propriedade anexada e pode ser definido em ScrollViewer e qualquer controle que possui um ScrollViewer no seu modelo de controle.
Controla que recursos de desempenho de implementar
A tabela a seguir lista os controles comuns para a exibição de dados e o suporte dos recursos de desempenho. Consulte as seções anteriores para obter informações sobre como ativar esses recursos.
Control |
Virtualização |
Reciclagem de contêiner |
Foi adiado de rolagem |
---|---|---|---|
Pode ser ativado. |
Pode ser ativado. |
Pode ser ativado. |
|
Pode ser ativado. |
Pode ser ativado. |
Pode ser ativado. |
|
Not available |
Not available |
Pode ser ativado. |
|
Default |
Pode ser ativado. |
Pode ser ativado. |
|
Default |
Pode ser ativado. |
Pode ser ativado. |
|
Pode ser ativado. |
Pode ser ativado. |
Pode ser ativado. |
|
Not available |
Not available |
Pode ser ativado. |
Observação
Para obter um exemplo de como habilitar a virtualização e o recipiente de reciclagem em um TreeView, consulte Como: Melhorar o desempenho de um TreeView..
Consulte também
Tarefas
Demonstra Passo a passo: Cache de dados de aplicativo em um aplicativo WPF
Conceitos
Otimização de desempenho: Layout and Design