共用方式為


x:DeferLoadStrategy 屬性

重要

從 Windows 10 版本 1703 (Creators Update) 開始,x:DeferLoadStrategyx:Load 屬性取代。 使用 x:Load="False" 相當於 x:DeferLoadStrategy="Lazy",但提供了在需要時卸載 UI 的能力。 有關詳細資訊,請參閱 x:Load 屬性

您可以使用 x:DeferLoadStrategy="Lazy" 最佳化 XAML 應用程式的啟動或樹狀結構建立效能。 當您使用 x:DeferLoadStrategy="Lazy"時,會延遲建立元素及其下層,進而降低啟動時間和記憶體成本。 這對於降低不常或有條件地顯示的元素成本很有用。 從程式碼或 VisualStateManager 參考元素時,將會實現元素。

不過,XAML 架構對延遲元素的追蹤會將大約 600 個位元組,新增至受影響的每個元素的記憶體使用量。 您延遲的元素樹狀結構越大,將會節省更多的啟動時間,但代價是記憶體使用量越大。 因此,過度使用此屬性可能會導致效能下降。

XAML 屬性用法

<object x:DeferLoadStrategy="Lazy" .../>

備註

使用 x:DeferLoadStrategy 的限制是:

有數種不同的方式可以實現延遲元素:

  • 使用您在元素上定義的名稱呼叫 FindName
  • 使用您在元素上定義的名稱呼叫 GetTemplateChild
  • VisualState 中,使用針對延遲元素的 Setter Storyboard 動畫。
  • 將任何分鏡腳本中的延遲元素做為目標。
  • 使用以延遲元素為目標的繫結。

注意:一旦元素的具現化啟動,就會在 UI 執行緒上建立它,因此,如果一次建立太多,它可能會導致 UI 變得卡頓。

一旦以先前所列的任何方式建立延遲元素,就會發生數件事:

  • 引發元素上的已載入事件。
  • 會評估元素上的任何繫結。
  • 如果您已註冊以在包含延遲元素的屬性上接收屬性變更通知,則會引發通知。

您可以巢狀延遲的元素,不過它們必須從最外層元素中實現。  如果您嘗試在上層元素實現之前實現下層元素,則會引發例外狀況。

一般而言,建議您延遲無法在第一個畫面中檢視的元素。 尋找要推遲的候選項目的一個很好的指導方針,是尋找使用折疊可見度建立的元素。 此外,使用者互動所觸發的 UI 是尋找您可以延遲之元素的好位置。

請小心延遲 ListView 中的元素,因為它會減少啟動時間,但也可能降低平移效能,這取決於您所建立的內容。 如果您希望提高平移效能,請參閱 {x:Bind} 標記延伸x:Phase 屬性文件。

如果 x:Phase 屬性與 x:DeferLoadStrategy 結合使用,那麼當實作元素或元素樹狀結構時,繫結將會套用到目前階段 (包括目前階段)。 為 x:Phase 指定的階段不會影響或控制元素的延遲。 當清單項目做為平移的一部分被回收時,已實現的元素的行為方式與其他使用中元素相同,並且已編譯的繫結 ({x:Bind} 繫結) 使用相同的規則 (包括分階段) 進行處理。

一般指導方針是測量您應用程式前後的效能,以確保您取得所需的效能。

範例

<Grid x:Name="DeferredGrid" x:DeferLoadStrategy="Lazy">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Rectangle Height="100" Width="100" Fill="#F65314" Margin="0,0,4,4" />
    <Rectangle Height="100" Width="100" Fill="#7CBB00" Grid.Column="1" Margin="4,0,0,4" />
    <Rectangle Height="100" Width="100" Fill="#00A1F1" Grid.Row="1" Margin="0,4,4,0" />
    <Rectangle Height="100" Width="100" Fill="#FFBB00" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0" />
</Grid>
<Button x:Name="RealizeElements" Content="Realize Elements" Click="RealizeElements_Click"/>
private void RealizeElements_Click(object sender, RoutedEventArgs e)
{
    // This will realize the deferred grid.
    this.FindName("DeferredGrid");
}