Important
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 アニメーションまたはストーリーボード アニメーションを使用します。
- ストーリーボード内の遅延された要素を指定します。
- 遅延要素を対象とするバインディングを使用します。
注: 要素のインスタンス化が開始されると、その要素は UI スレッド上に作成されるため、一度に作成した数が多すぎると UI が途切れる可能性があります。
前に示した方法のいずれかで遅延要素が作成されると、いくつかの処理が行われます。
- 要素の Loaded イベントが発生します。
- 要素のバインドはすべて評価されます。
- 遅延要素を含むプロパティのプロパティ変更通知を受信するように登録している場合は、通知が発生します。
遅延要素は入れ子にすることができますが、最も外側の要素から実現する必要があります。 親が実現される前に子要素を実現しようとすると、例外が発生します。
通常、最初のフレームでは表示できない要素を延期することをお勧めします。 遅延する候補を見つけるための適切なガイドラインは、折りたたまれた可視性で作成されている要素を探 することです。 また、ユーザーの操作によってトリガーされる UI は、延期できる要素を探すのに適した場所です。
ListView の要素を遅延させると、起動時間が長くなる可能性がありますが、作成する内容によってはパンニングのパフォーマンスも低下する可能性があるため注意が必要です。 パンのパフォーマンスを向上させる場合は、 {x:Bind} マークアップ拡張機能 と x:Phase 属性 のドキュメントを参照してください。
x:Phase 属性が x:DeferLoadStrategy と組み合わせて使用されている場合、要素または要素ツリーが実現されると、バインディングは現在のフェーズまで適用されます。 x:Phase に指定されたフェーズは、要素の遅延に影響を与えたり制御したりしません。 リスト 項目がパンの一部としてリサイクルされると、実現された要素は他のアクティブな要素と同じように動作し、コンパイルされたバインド ({x:Bind} バインド) は、フェーズを含む同じルールを使用して処理されます。
一般的なガイドラインは、アプリのパフォーマンスを前後に測定して、必要なパフォーマンスを得ることを確認することです。
Example
<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");
}
Windows developer