Атрибут x:Phase

Используйте x:Phase с расширением разметки {x:Bind}, чтобы отрисовывать элементы ListView и GridView постепенно и улучшить процесс прокрутки. x:Phase предоставляет декларативный способ достижения того же эффекта, что и событие ContainerContentChanging для ручного управления отрисовкой элементов списка. Также см. пошаговое обновление элементов ListView и GridView.

Использование атрибута XAML

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

Значения XAML

Срок Description
PhaseValue Число, указывающее этап обработки элемента. Значение по умолчанию — 0.

Замечания

Если список быстро прокручивается с помощью сенсорного ввода или колесика мыши, то в зависимости от сложности шаблона данных, список может быть не в состоянии отрисовать элементы достаточно быстро, чтобы соответствовать скорости прокрутки. Это особенно верно для переносимого устройства с эффективной мощностью ЦП, например планшета.

Поэтапное отображение шаблона данных обеспечивает постепенную отрисовку, чтобы можно было задавать приоритет содержимому и первыми отрисовать наиболее важные элементы. Это позволяет списку отображать некоторое содержимое каждого элемента при быстрой прокрутке, и по мере возможности отрисовывать больше элементов каждого шаблона.

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>

Шаблон данных описывает 4 этапа:

  1. Представляет текстовый блок "DisplayName". Все элементы управления без указанного этапа будут неявно считаться частью этапа 0.
  2. Отображает блок текста в формате prettyDate.
  3. Отображает текстовые блоки prettyFileSize и prettyImageSize.
  4. Отображает изображение.

Фазирование — это функция {x:Bind} , которая работает с элементами управления, производными от ListViewBase , и которая постепенно обрабатывает шаблон элемента для привязки данных. При отрисовке элементов списка ListViewBase отрисовывает один этап для всех элементов в представлении, прежде чем переходить к следующему этапу. Работа отрисовки выполняется в пакетах срезами времени, чтобы по мере прокрутки списка необходимые действия можно повторно оценить и не выполнять для элементов, которые больше не видны.

Атрибут x:Phase можно указать в любом элементе шаблона данных, использующего {x:Bind}. Если элемент имеет этап, отличный от 0, элемент будет скрыт от представления (через непрозрачность, а не видимость) до тех пор, пока этот этап не будет обработан и привязки будут обновлены. Когда прокручивается элемент управления, производный от ListViewBase, он будет переиспользовать шаблоны элементов из тех, которые больше не находятся на экране, для отображения новых видимых элементов. Элементы пользовательского интерфейса в шаблоне будут сохранять старые значения, пока они не будут привязаны к данным снова. Фазирование приводит к задержке шага привязки данных, поэтому фазирование необходимо скрыть элементы пользовательского интерфейса, если они являются устаревшими.

Каждый элемент пользовательского интерфейса может иметь только один этап. Если это так, это будет применяться ко всем привязкам элемента. Если этап не указан, предполагается этап 0.

Номера этапов не должны быть смежными и совпадают со значением ContainerContentChangingEventArgs.Phase. Событие ContainerContentChanging будет вызываться для каждого этапа перед обработкой привязок x:Phase .

Фазирование влияет только на привязки {x:Bind} , а не на привязки {Binding} .

Фазирование будет применяться только в том случае, если шаблон элемента отрисовывается с помощью элемента управления, который учитывает фазирование. Для Windows 10 это означает ListView и GridView. Фазирование не будет применяться к шаблонам данных, используемым в других элементах управления, или для других сценариев, таких как ContentTemplate или Hub , в этих случаях все элементы пользовательского интерфейса будут привязаны к данным одновременно.