x:DeferLoadStrategy 屬性

重要

從 Windows 10 版本 1703 開始(Creators Update),x:DeferLoadStrategy 會由 x: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 的限制如下:

  • 您必須為元素定義 x:Name ,因為稍後需要尋找元素的方法。
  • 您只能延遲衍生自 UIElement FlyoutBase 的類型。
  • 您無法延遲 PageUserControlDataTemplate 中的根元素。
  • 您無法延遲 ResourceDictionary 中的元素。
  • 您無法延遲使用 XamlReader.Load 載入的鬆散 XAML。
  • 移動父元素將會清除任何尚未實現的專案。

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

  • 使用您在 項目上定義的名稱呼叫 FindName
  • 使用您在 項目上定義的名稱呼叫 GetTemplateChild
  • 在 VisualState 中,使用以延後項目為目標的 SetterStoryboard 動畫。
  • 以任何 分鏡腳本中的延後項目為目標。
  • 使用以延後項目為目標的系結。

注意:一旦元素的具現化啟動,就會在UI線程上建立它,因此,如果一次建立太多,它可能會導致UI變得口吃不清。

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

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

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

一般而言,建議您延遲無法在第一個畫面格中檢視的專案。 尋找要延遲的候選專案的良好指導方針,是尋找以折疊 可見度建立的專案。 此外,用戶互動所觸發的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");
}