x:Phase 属性

x:Phase{x:Bind} 标记扩展结合使用,以便能以增量方式呈现 ListViewGridView 项并改进平移体验。 为了能实现与使用 ContainerContentChanging 事件手动控制列表项的呈现相同的效果,x:Phase 提供了一种声明性方法。 另请参阅以增量方式更新 ListView 和 GridView 项

XAML 属性使用方法

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

XAML 值

术语 说明
PhaseValue 一个用于指示将处理的元素所处的阶段的数字。 默认值为 0。

注解

如果列表既能借助触摸快速平移又能使用鼠标滚轮实现,则该列表可能无法以足够快地速度呈现项目以跟上滚动速度,具体取决于数据模板的复杂程度。 这对于带有节能 CPU 的便携式设备(如平板电脑)尤其如此。

阶段支持递增式呈现数据模板,以便可为内容设定优先级,即最重要的元素最先呈现。 这使列表能够在平移速度较快时为每个项显示相应内容,并且将在时间允许的情况下为每个模板呈现更多的元素。

示例

<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 派生的控件时,它将从不再显示在屏幕上的项中回收项目模板,以呈现新的可见项。 模板内的 UI 元素将保留其旧值,直到它们再次进行数据绑定。 阶段将导致数据绑定步骤延迟,因此它需要隐藏 UI 元素,以防这些元素过时。

每个 UI 元素可能只具有一个指定阶段。 如果是,这将应用于元素上的所有绑定。 如果未指定阶段,将假定阶段 0。

阶段数字不需要是连续的,不过需与 ContainerContentChangingEventArgs.Phase 值相同。 在处理 x:Phase 绑定前,将针对每个阶段引发 ContainerContentChanging 事件。

阶段仅影响 {x:Bind} 绑定,而不会影响 {Binding} 绑定。

仅当项目模板使用阶段感知的控件进行呈现时,才应用阶段。 对于 Windows 10,即表示 ListViewGridView。 阶段既不会应用于其他项目控件中所使用的数据模板,也不会应用于诸如 ContentTemplateHub 等部分中的方案,因为在这些用例中,将一次数据绑定所有 UI 元素。