Partilhar via


x:Atributo de fase

Use x:Phase com a extensão de marcação {x:Bind} para renderizar itens ListView e GridView incrementalmente e melhorar a experiência de deslizamento. 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 incrementalmente.

Uso de atributos XAML

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

Valores XAML

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

Observações

Se uma lista for movimentada 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. Isto é particularmente verdadeiro para um dispositivo portátil com uma CPU eficiente em termos energéticos, como um tablet.

O faseamento 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 conteúdo parcial para cada item se o deslocamento for rápido, e, se o tempo permitir, renderizará mais elementos de cada template.

Example

<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 controlos 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.

O Phasing é um recurso de {x:Bind} que funciona com controles derivados de ListViewBase e que processa incrementalmente o modelo de item para vinculaçã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 fatiados no 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 use {x:Bind}. Quando um elemento tem uma fase diferente de 0, o elemento ficará oculto da visualização (via Opacidade, não Visibilidade) até que essa fase seja processada e as ligaçõ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 vinculados a dados novamente. O faseamento faz com que essa etapa de vinculação de dados seja atrasada e, portanto, o faseamento precisa ocultar os elementos da interface do usuário caso eles estejam obsoletos.

Cada elemento da interface do usuário pode ter apenas uma fase especificada. Em caso afirmativo, isso aplicar-se-á a todas as ligaçõ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 ligações x:Phase sejam processadas.

O faseamento afeta apenas as ligações {x:Bind} , não as ligações {Binding} .

O faseamento só será aplicado quando o modelo de item for renderizado usando um controle ciente do faseamento. Para o Windows 10, isso significa ListView e GridView. O faseamento 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 vinculados a dados de uma só vez.