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變得口吃不清。
一旦以先前所列的任何方式建立延後元素,就會發生數件事:
- 會 引發 元素上的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");
}
意見反應
https://aka.ms/ContentUserFeedback。
即將推出:在 2024 年,我們將隨著內容的意見反應機制逐步淘汰 GitHub 問題,並以新的意見反應系統來取代。 如需詳細資訊,請參閱提交並檢視相關的意見反應