x:DeferLoadStrategy-Attribut
Wichtig
Ab Windows 10, Version 1703 (Creators Update), wird x:DeferLoadStrategy durch das x:Load-Attribut ersetzt. Die Verwendung x:Load="False"
ist gleichbedeutend mit x:DeferLoadStrategy="Lazy"
der Möglichkeit, die Benutzeroberfläche bei Bedarf zu entladen. Weitere Informationen finden Sie im x:Load-Attribut .
Sie können x:DeferLoadStrategy="Lazy" verwenden, um die Start- oder Strukturerstellungsleistung Ihrer XAML-App zu optimieren. Wenn Sie x:DeferLoadStrategy="Lazy" verwenden, wird die Erstellung eines Elements und der untergeordneten Elemente verzögert, wodurch die Startzeit und die Speicherkosten verringert werden. Dies ist hilfreich, um die Kosten für Elemente zu reduzieren, die selten oder bedingt angezeigt werden. Das Element wird erkannt, wenn es aus Code oder VisualStateManager referenziert wird.
Die Nachverfolgung verzögerter Elemente durch das XAML-Framework fügt jedoch etwa 600 Byte zur Speicherauslastung für jedes betroffene Element hinzu. Je größer die Elementstruktur, die Sie zurückstellen, desto mehr Startzeit sparen Sie, aber zu lasten eines größeren Speicherbedarfs. Daher ist es möglich, dieses Attribut zu überlasten, soweit die Leistung verringert wird.
XAML-Attributsyntax
<object x:DeferLoadStrategy="Lazy" .../>
Hinweise
Die Einschränkungen für die Verwendung von x:DeferLoadStrategy sind:
- Sie müssen einen x:Name für das Element definieren, da es eine Möglichkeit geben muss, das Element später zu finden.
- Sie können nur Typen zurückstellen, die von UIElement oder FlyoutBase abgeleitet werden.
- Stammelemente in einer Seite, einem UserControl oder einer DataTemplate können nicht zurückgestellt werden.
- Elemente in einem ResourceDictionary können nicht zurückgestellt werden.
- Sie können loses XAML nicht zurückstellen, das mit XamlReader.Load geladen wurde.
- Durch das Verschieben eines übergeordneten Elements werden alle Elemente gelöscht, die nicht realisiert wurden.
Es gibt verschiedene Möglichkeiten, die verzögerten Elemente zu erkennen:
- Rufen Sie FindName mit dem Namen auf, den Sie für das Element definiert haben.
- Rufen Sie GetTemplateChild mit dem Namen auf, den Sie für das Element definiert haben.
- Verwenden Sie in einem VisualState-Element eine Setter- oder Storyboardanimation, die auf das verzögerte Element ausgerichtet ist.
- Ziel des verzögerten Elements in einem beliebigen Storyboard.
- Verwenden Sie eine Bindung, die auf das verzögerte Element ausgerichtet ist.
HINWEIS: Sobald die Instanziierung eines Elements gestartet wurde, wird es im UI-Thread erstellt, sodass die Benutzeroberfläche stottern kann, wenn zu viel gleichzeitig erstellt wird.
Sobald ein verzögertes Element auf eine der zuvor aufgeführten Arten erstellt wurde, passieren mehrere Dinge:
- Das Loaded-Ereignis für das Element wird ausgelöst.
- Alle Bindungen für das Element werden ausgewertet.
- Wenn Sie für den Empfang von Eigenschaftsänderungsbenachrichtigungen für die Eigenschaft registriert haben, die das verzögerte Element(n) enthält, wird die Benachrichtigung ausgelöst.
Sie können verzögerte Elemente verschachteln, sie müssen jedoch aus dem äußersten Element realisiert werden. Wenn Sie versuchen, ein untergeordnetes Element zu erkennen, bevor das übergeordnete Element erkannt wurde, wird eine Ausnahme ausgelöst.
In der Regel wird empfohlen, Elemente zurückstellen, die im ersten Frame nicht angezeigt werden können. Eine gute Richtlinie für das Auffinden von Kandidaten, die zurückgestellt werden sollen, besteht darin, nach Elementen zu suchen, die mit reduzierter Sichtbarkeit erstellt werden. Darüber hinaus ist die Benutzeroberfläche, die von der Benutzerinteraktion ausgelöst wird, ein guter Ort, um nach Elementen zu suchen, die Sie zurückstellen können.
Seien Sie vorsichtig beim Zurückstellen von Elementen in einer ListView, da sie die Startzeit verringert, aber auch die Leistung beim Verschieben verringern könnte, je nachdem, was Sie erstellen. Wenn Sie die Verschiebungsleistung erhöhen möchten, lesen Sie die Dokumentation zur {x:Bind}-Markuperweiterung und zum x:Phase-Attribut .
Wenn das x:Phase-Attribut in Verbindung mit x:DeferLoadStrategy verwendet wird, werden die Bindungen bis einschließlich der aktuellen Phase angewendet, wenn ein Element oder eine Elementstruktur realisiert wird. Die für x:Phase angegebene Phase wirkt sich nicht auf die Verzögerung des Elements aus oder steuert sie nicht. Wenn ein Listenelement als Teil der Verschiebung wiederverwendet wird, verhalten sich realisierte Elemente auf die gleiche Weise wie andere aktive Elemente, und kompilierte Bindungen ({x:Bind} -Bindungen) werden mit den gleichen Regeln verarbeitet, einschließlich Phasing.
Eine allgemeine Richtlinie besteht darin, die Leistung Ihrer App vorher und nachher zu messen, um sicherzustellen, dass Sie die gewünschte Leistung erhalten.
Beispiel
<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");
}