Usando a virtualização com uma lista ou grade (XAML)

Applies to Windows and Windows Phone

Muitos aplicativos exibem e manipulam coleções de dados, como uma lista de resultados de busca ou um álbum de fotos. Quando a coleção é muito grande, o desempenho pode ser degradado ao exibir ou manipular a coleção. Para melhorar o desempenho com grandes conjuntos de dados, você pode usar a virtualização. Os ItemsControls suportam virtualização de interface de usuário e de dados.

Observação   O ItemsControlé a classe básica para vários controles de coleta comuns, incluindo os controles ListView, GridView, FlipView, ListBox, e ComboBox. Estes exemplos usam os controles ListView e GridView, mas as informações se aplicam geralmente a ItemsControls.

Virtualização de interface do usuário

Quando você adicionar um item a um ItemsControl, o item é encapsulado em um contêiner de um tem. Por exemplo, um item adicionado a um ListView é encapsulado em um ListViewItem. Sem a virtualização de interface do usuário, o conjunto de dados é mantido na memória e um contêiner de item também é criado para cada item no conjunto de dados. Um ListView que está vinculado a uma coleção de 1.000 itens também criará 1000 contêineres de ListViewItem que estão armazenados na memória.

Com a virtualização de interface do usuário, o conjunto de dados ainda é mantido na memória, mas um contêiner de item é criado apenas quando o item está quase pronto para ser mostrado na interface do usuário. Um ListView que usa virtualização de interface do usuário pode manter somente 20 objetos de ListViewItem na memória. Ele cria ou re-utiliza os ListViewItems à medida que o usuário rola pela lista. (O número de objetos de ListViewItem depende da quantidade de itens exibidos na interface do usuário.) Por padrão, o ItemsControl e os controles padrão derivados dele, suportam virtualização de interface do usuário. Mas a virtualização de interface do usuário é desativada em algumas circunstâncias. Nós observamos estas circunstâncias agora para que você possa tomar decisões informadas ao criar seu aplicativo.

Tamanho do visor

Ao discutir a virtualização, é importante compreender o conceito de visor, ou a área do ItemsControl que exibe o conteúdo. Você também precisa entender como um contêiner pai afeta o tamanho do visor de um controle.

Alguns contêineres restringem o tamanho dos seus filhos. Aqui, colocamos um GridView dentro de um Grid. O visor do GridView é restringido ao tamanho do Grid pai. O usuário pode rolar itens ocultos para exibição usando barras de rolagem.


<Grid Height="400" Width="600">
    <GridView Background="DarkGreen" ItemsSource="{Binding}"/>
</Grid>

Um GridView em uma grade

Outros contêineres deixam seus filhos usar um espaço ilimitado para exibir seu conteúdo, mesmo se o espaço se estender além dos limites visíveis do contêiner. Aqui, colocamos o mesmo GridView dentro de um Canvas. Os vínculos visíveis do Canvas são destacados em azul. O visor do GridView aumenta para ajustar todos os seus itens, e se estica para além dos limites visíveis do contêiner. (Os itens acinzentados nesta imagem não são visíveis em um aplicativo real.) Não há barras de rolagem, de modo que o usuário não pode rolar itens ocultos para exibição.


<Canvas Height="400" Width="600">
    <GridView Background="DarkGreen" ItemsSource="{Binding}"/>
</Canvas>

Um GridView em uma tela

Quando o tamanho do visor do ItemsControl não é restrito, o controle não executa virtualização. Em vez disso, ele cria um contêiner de item para cada item em sua coleção. Alguns contêineres comuns que não restringem o tamanho do visor são Canvas, StackPanel e ScrollViewer. Você pode habilitar a virtualização nesta situação, definindo o tamanho do ItemsControl diretamente, em vez de deixá-lo ser dimensionado por seu contêiner pai.

Aqui, definimos o Height e Width no GridView. Isso restringe o tamanho do visor, e itens fora da visor são virtualizados.


<Canvas>
    <GridView Background="DarkGreen" ItemsSource="{Binding}"
              Height="400" Width="600"/>
</Canvas>

ItemsPanel

Um ItemsControl usa seu ItemsPanel para determinar como os itens são organizados na interface do usuário. O design de seu aplicativo pode exigir que você altere o padrão ItemsPanel para um diferente. Se o novo painel suportar virtualização de interface do usuário, o controle continuará realizando a virtualização como antes. Dentre os painéis de virtualização padrão estão WrapGrid e VirtualizingStackPanel.

Se você substituir o painel padrão em um ItemsControl por um painel sem virtualização, como VariableSizedWrapGrid ou StackPanel, a virtualização da interface do usuário será desabilitada para esse controle.

Dados agrupados

A virtualização da interface do usuário não é suportada para dados agrupados. Para mais informações sobre dados de agrupamento, veja Como agrupar itens em uma lista ou grade. Se você precisar fornecer uma navegação rápida através de um grande conjunto de dados agrupados, considere usar um controle SemanticZoom. Para mais informações, veja Guia de início rápido: adicionando controles SemanticZoom.

Virtualização de dados

Com a virtualização da interface do usuário, todo o conjunto de dados é armazenado na memória. Às vezes, o conjunto de dados é tão grande que não pode ou não deve ser armazenado na memória de uma só vez. Neste caso, você pode usar a virtualização de dados para obter apenas um subconjunto dos dados para trabalhar. O ItemsControl ainda pode aplicar a virtualização de interface do usuário ao subconjunto de dados criado pela virtualização de dados.

Virtualização de acesso aleatório

A virtualização de acesso aleatório de dados permite que você recupere um subconjunto de dados de qualquer lugar em todo o conjunto de dados. Por exemplo, se um ListView for vinculado a uma coleção de 100.000 itens e o usuário rolar para o meio da coleção, seu aplicativo pode baixar apenas os itens 50.000 - 50.050. Se ele rolar até o final da lista, o aplicativo baixará os itens 99.950 – 100.000. O indicador de rolagem da barra de rolagem, ou polegar, é sempre dimensionada para representar a sua posição em todo o conjunto de dados de 100.000 itens.

Para usar o acesso aleatório a virtualização de dados, você deve usar uma fonte de dados que implementa INotifyCollectionChanged e IObservableVector.

Virtualização incremental

Com a virtualização incremental de dados, seu aplicativo baixa dados sequenciamente. Por exemplo, se um ListView for vinculado a uma coleção de 100.000 itens, seu aplicativo poderá baixar somente os itens 1 a 50. O polegar da barra de rolagem é dimensionado para representar a sua posição no conjunto de dados inicial de 50 itens. Quando o usuário rola próximo ao final da lista, os itens 51 a 100 são baixados. O polegar da barra de rolagem é redimensionado para representar a sua posição no conjunto de 100 itens de dados atualizados.

Para utilizar a virtualização de dados incremental, você deve usar uma fonte de dados que implementa ISupportIncrementalLoading. Quando você usa a virtualização de dados incremental com um ListView ou GridView,você pode usar esses membros para controlar o carregamento de dados: DataFetchSize, IncrementalLoadingThreshold, IncrementalLoadingTrigger, LoadMoreItemsAsync.

Tópicos relacionados

ListView
GridView
Início rápido: adicionando controles ListView e GridView
Mapa de aplicativos do Tempo de Execução do Windows em C# ou Visual Basic
Mapa de aplicativos do Tempo de Execução do Windows em C++

 

 

Mostrar:
© 2014 Microsoft