Compartilhar via


atributo x:Phase

Use x:Phase com a extensão de marcação {x:Bind} para renderizar itens ListView e GridView de forma incremental e melhorar a experiência de movimento panorâmico. x:Phase fornece uma maneira declarativa de obter o mesmo efeito que usar o evento ContainerContentChanging para controlar manualmente a renderização de itens de lista. Consulte também Atualizar itens ListView e GridView de forma incremental.

Uso do atributo XAML

<object x:Phase="PhaseValue".../>

Valores XAML

Termo Descrição
Valor da fase Um número que indica a fase em que o elemento será processado. O padrão é 0.

Comentários

Se uma lista for deslocada rapidamente com toque ou usando a roda do mouse, dependendo da complexidade do modelo de dados, a lista pode não ser capaz de renderizar itens com rapidez suficiente para acompanhar a velocidade de rolagem. Isso é particularmente verdadeiro para um dispositivo portátil com uma CPU com baixo consumo de energia, como um tablet.

A fase permite a renderização incremental do modelo de dados para que o conteúdo possa ser priorizado e os elementos mais importantes renderizados primeiro. Isso permite que a lista mostre algum conteúdo para cada item se estiver girando rapidamente e renderizará mais elementos de cada modelo conforme o tempo permitir.

Exemplo

<DataTemplate x:Key="PhasedFileTemplate" x:DataType="model:FileItem">
    <Grid Width="200" Height="80">
        <Grid.ColumnDefinitions>
           <ColumnDefinition Width="75" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Image Grid.RowSpan="4" Source="{x:Bind ImageData}" MaxWidth="70" MaxHeight="70" x:Phase="3"/>
        <TextBlock Text="{x:Bind DisplayName}" Grid.Column="1" FontSize="12"/>
        <TextBlock Text="{x:Bind prettyDate}"  Grid.Column="1"  Grid.Row="1" FontSize="12" x:Phase="1"/>
        <TextBlock Text="{x:Bind prettyFileSize}"  Grid.Column="1"  Grid.Row="2" FontSize="12" x:Phase="2"/>
        <TextBlock Text="{x:Bind prettyImageSize}"  Grid.Column="1"  Grid.Row="3" FontSize="12" x:Phase="2"/>
    </Grid>
</DataTemplate>

O modelo de dados descreve 4 fases:

  1. Apresenta o bloco de texto DisplayName. Todos os controles sem uma fase especificada serão implicitamente considerados parte da fase 0.
  2. Mostra o bloco de texto prettyDate.
  3. Mostra os blocos de texto prettyFileSize e prettyImageSize.
  4. Mostra a imagem.

A fase é um recurso de {x:Bind} que funciona com controles derivados de ListViewBase e que processa incrementalmente o modelo de item para associação de dados. Ao renderizar itens de lista, ListViewBase renderiza uma única fase para todos os itens no modo de exibição antes de passar para a próxima fase. O trabalho de renderização é executado em lotes divididos em fatias de tempo para que, à medida que a lista é rolada, o trabalho necessário possa ser reavaliado e não executado para itens que não estão mais visíveis.

O atributo x:Phase pode ser especificado em qualquer elemento em um modelo de dados que usa {x:Bind}. Quando um elemento tiver uma fase diferente de 0, o elemento ficará oculto da exibição (por meio de Opacidade, não de Visibilidade) até que essa fase seja processada e as associações sejam atualizadas. Quando um controle derivado de ListViewBase é rolado, ele recicla os modelos de item de itens que não estão mais na tela para renderizar os itens recém-visíveis. Os elementos da interface do usuário dentro do modelo manterão seus valores antigos até que sejam associados a dados novamente. A fase faz com que essa etapa de associação de dados seja atrasada e, portanto, a fase precisa ocultar os elementos da interface do usuário caso estejam obsoletos.

Cada elemento da interface do usuário pode ter apenas uma fase especificada. Nesse caso, isso se aplicará a todas as associações no elemento. Se uma fase não for especificada, a fase 0 será assumida.

Os números de fase não precisam ser contíguos e são iguais ao valor de ContainerContentChangingEventArgs.Phase. O evento ContainerContentChanging será gerado para cada fase antes que as associações x:Phase sejam processadas.

A fase afeta apenas as associações {x:Bind} , não as associações {Binding} .

A fase só será aplicada quando o modelo de item for renderizado usando um controle que esteja ciente da fase. Para Windows 10, isso significa ListView e GridView. A fase não se aplicará a modelos de dados usados em outros controles de item ou para outros cenários, como seções ContentTemplate ou Hub — nesses casos, todos os elementos da interface do usuário serão associados a dados de uma só vez.