Поделиться через


Атрибут x:Phase

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

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

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

Значения XAML

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

Замечания

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

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

Пример

<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 , в этих случаях все элементы пользовательского интерфейса будут привязаны к данным одновременно.