Share via


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" von entspricht x:DeferLoadStrategy="Lazy", bietet aber die 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 seiner untergeordneten Elemente verzögert, wodurch die Startzeit und die Arbeitsspeicherkosten reduziert werden. Dies ist nützlich, um die Kosten von Elementen zu reduzieren, die selten oder bedingt angezeigt werden. Das Element wird realisiert, wenn von Code oder VisualStateManager auf es verwiesen wird.

Die Nachverfolgung von verzögerten Elementen durch das XAML-Framework fügt der Speicherauslastung für jedes betroffene Element jedoch etwa 600 Bytes hinzu. Je größer die verzögerte Elementstruktur ist, desto mehr Startzeit sparen Sie – aber auf Kosten eines größeren Arbeitsspeicherbedarfs. Daher ist es möglich, dieses Attribut so weit zu verwenden, dass ihre Leistung abnimmt.

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 sind.
  • Stammelemente in einer Seite, einem UserControl oder einer DataTemplate können nicht zurückgestellt werden.
  • Sie können elemente in einem ResourceDictionary nicht zurückstellen.
  • Mit XamlReader.Load geladene lose XAML-Dateien können nicht zurückgestellt werden.
  • Durch das Verschieben eines übergeordneten Elements werden alle Elemente gelöscht, die nicht erkannt wurden.

Es gibt mehrere Möglichkeiten, verzögerte Elementen 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 visualState eine Setter- oder Storyboardanimation , die auf das verzögerte Element abzielt.
  • Legen Sie das verzögerte Elemente in allen Storyboards als Ziel fest.
  • Verwenden Sie eine Bindung, die auf das verzögerte Element abzielt.

HINWEIS: Nach Start der Instanziierung eines Elements wird es im Benutzeroberflächen-Thread erstellt. Dies kann ggf. bewirken, dass die Oberfläche ruckelt, wenn zu viele auf einmal erstellt werden.

Sobald ein verzögertes Element auf eine der zuvor aufgeführten Arten erstellt wurde, geschieht folgendes:

  • Das Loaded-Ereignis für das -Element wird ausgelöst.
  • Alle Bindungen für das Element werden ausgewertet.
  • Wenn Sie sich für den Empfang von Eigenschaftsänderungsbenachrichtigungen für die Eigenschaft registriert haben, die die verzögerten Elemente enthält, wird die Benachrichtigung ausgelöst.

Sie können verzögerte Elemente verschachteln, jedoch müssen Sie vom äußersten Element aus nach innen erkannt werden.  Wenn Sie versuchen, ein untergeordnetes Element zu erkennen, bevor das übergeordnete Element realisiert wurde, wird eine Ausnahme ausgelöst.

In der Regel wird empfohlen, Elemente zurückstellen, die im ersten Frame nicht sichtbar sind. Bei der Suche nach zu verzögernden Kandidaten empfiehlt es sich, nach Elementen zu suchen, die mit reduzierter Visibility erstellt werden. Außerdem ist die Benutzeroberfläche, die durch Benutzerinteraktionen ausgelöst wird, ein guter Ort, um nach Elementen zu suchen, die Sie zurückstellen können.

Seien Sie vorsichtig, wenn Sie Elemente in einer ListView zurückstellen, da dies die Startzeit verringert, aber auch die Verschiebungsleistung je nach Dem, was Sie erstellen, beeinträchtigen kann. Wenn Sie die Verschiebungsleistung erhöhen möchten, lesen Sie die { x:Bind}-Markuperweiterung und die Dokumentation zu x:Phase-Attributen .

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 im Rahmen 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 nach 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");
}