Атрибут x:Phase

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

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

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

Значения XAML

Термин Описание
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, будет скрыт (посредством свойства Opacity, а не Visibility) и появится только после завершения данного этапа и обновления привязок данных. При прокручивании элемента управления ListViewBase обработка шаблонов для элементов, которых уже нет на экране, будет перезапущена для выполнения отрисовки только что появившихся элементов. Элементы пользовательского интерфейса в шаблоне сохраняют старые значения до тех пор, пока не будет выполнена повторная привязка данных. Из-за фазирования возникает задержка на этапе привязки данных, в связи с чем функция фазирования предусматривает скрытие элементов пользовательского интерфейса, если они устарели.

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

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

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

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