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 的類型。
- 您不能延遲 Page、UserControl 或DataTemplate 中的根元素。
- 您無法延遲 ResourceDictionary 中的元素。
- 您無法延遲使用 XamlReader.Load 載入的鬆散 XAML。
- 移動上層元素將會清除任何尚未實現的元素。
有數種不同的方式可以實現延遲元素:
- 使用您在元素上定義的名稱呼叫 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");
}