Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
Os contêineres de itens são adicionados diretamente ao ItemsControl. Por exemplo, se um aplicativo adicionar explicitamente ListBoxItem objetos a um ListBox, o ListBox não virtualizará os objetos ListBoxItem.
Os contentores de itens no ItemsControl são de vários tipos. Por exemplo, um Menu que usa objetos Separator não pode implementar a reciclagem de itens porque o Menu contém objetos do tipo Separator e MenuItem.
Definir CanContentScroll para
false.Definir IsVirtualizing para
false.
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
.NET Desktop feedback