x:Load-Attributx:Load attribute

Sie können x:Load verwenden, um den Start, die visuelle Struktur Erstellung und die Speicherauslastung ihrer XAML-APP zu optimieren.You can use x:Load to optimize the startup, visual tree creation, and memory usage of your XAML app. Die Verwendung von x:Load hat einen ähnlichen visuellen Effekt wie Sichtbarkeit, außer wenn das Element nicht geladen wird, wird sein Arbeitsspeicher freigegeben, und intern wird ein kleiner Platzhalter verwendet, um die Position in der visuellen Struktur zu markieren.Using x:Load has a similar visual effect to Visibility, except that when the element is not loaded, its memory is released and internally a small placeholder is used to mark its place in the visual tree.

Das Benutzeroberflächen Element, das mit "x:Load" attributiert wurde, kann über Code geladen und entladen werden oder mithilfe eines x:Bind -Ausdrucks.The UI element attributed with x:Load can be loaded and unloaded via code, or using an x:Bind expression. Dies ist hilfreich, um die Kosten für Elemente zu reduzieren, die selten oder bedingt angezeigt werden.This is useful to reduce the costs of elements that are shown infrequently or conditionally. Wenn Sie x:Load für einen Container wie Grid oder StackPanel verwenden, werden der Container und alle untergeordneten Elemente als Gruppe geladen oder entladen.When you use x:Load on a container such as Grid or StackPanel, the container and all of its children are loaded or unloaded as a group.

Die Nachverfolgung von verzögerten Elementen durch das XAML-Framework fügt der Speicherauslastung für jedes mit x:Load zugeordneten Element ungefähr 600 Bytes hinzu, um den Platzhalter zu berücksichtigen.The tracking of deferred elements by the XAML framework adds about 600 bytes to the memory usage for each element attributed with x:Load, to account for the placeholder. Daher ist es möglich, dieses Attribut in dem Ausmaß zu überschreiten, in dem sich die Leistung tatsächlich verringert.Therefore, it's possible to overuse this attribute to the extent that your performance actually decreases. Es wird empfohlen, dass Sie Sie nur für Elemente verwenden, die ausgeblendet werden müssen.We recommend that you only use it on elements that need to be hidden. Wenn Sie x:Load für einen Container verwenden, wird der Aufwand nur für das-Element mit dem x:Load-Attribut bezahlt.If you use x:Load on a container, then the overhead is paid only for the element with the x:Load attribute.

Wichtig

Das Attribut x:Load ist ab Windows 10, Version 1703 (Creators Update) verfügbar.The x:Load attribute is available starting in Windows 10, version 1703 (Creators Update). Die minimale Version Ihres Visual Studio-Projekts muss Windows 10 Creators Update (10,0, Build 15063) sein, damit x:loadverwendet werden kann.The min version targeted by your Visual Studio project must be Windows 10 Creators Update (10.0, Build 15063) in order to use x:Load.

XAML-AttributsyntaxXAML attribute usage

<object x:Load="True" .../>
<object x:Load="False" .../>
<object x:Load="{x:Bind Path.to.a.boolean, Mode=OneWay}" .../>

Elemente werden geladen.Loading Elements

Es gibt verschiedene Möglichkeiten, die Elemente zu laden:There are several different ways to load the elements:

  • Verwenden Sie einen x:Bind -Ausdruck zum Angeben des Ladezustands.Use an x:Bind expression to specify the load state. Der Ausdruck sollte true zurückgeben, um geladen zu werden, und false zum Entladen des Elements.The expression should return true to load and false to unload the element.
  • Ruft FindName mit dem Namen auf, den Sie für das Element definiert haben.Call FindName with the name that you defined on the element.
  • Aufrufen von GetTemplateChild mit dem Namen, den Sie für das Element definiert haben.Call GetTemplateChild with the name that you defined on the element.
  • Verwenden Sie in einem VisualStateeine Setter -oder Storyboard -Animation, die das x:Load-Element als Ziel hat.In a VisualState, use a Setter or Storyboard animation that targets the x:Load element.
  • Das entladene Element in einem beliebigen Storyboardals Ziel.Target the unloaded element in any Storyboard.

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.NOTE: Once the instantiation of an element has started, it is created on the UI thread, so it could cause the UI to stutter if too much is created at once.

Nachdem ein verzögertes Element in einer der zuvor aufgeführten Methoden erstellt wurde, geschieht Folgendes:Once a deferred element is created in any of the ways listed previously, several things happen:

  • Das geladene -Ereignis für das-Element wird ausgelöst.The Loaded event on the element is raised.
  • Das-Feld für "x:Name" wird festgelegt.The field for x:Name is set.
  • Alle x:Bind-Bindungen für das Element werden ausgewertet.Any x:Bind bindings on the element are evaluated.
  • Wenn Sie sich für das Empfangen von Benachrichtigungen über Eigenschafts Änderungen für die Eigenschaft registriert haben, die das verzögerte Element (en) enthält, wird die Benachrichtigung ausgelöst.If you have registered to receive property change notifications on the property containing the deferred element(s), the notification is raised.

Entladen von ElementenUnloading elements

So entladen Sie ein Element:To unload an element:

  • Verwenden Sie einen x:Bind-Ausdruck zum Angeben des Ladezustands.Use an x:Bind expression to specify the load state. Der Ausdruck sollte true zurückgeben, um geladen zu werden, und false zum Entladen des Elements.The expression should return true to load and false to unload the element.
  • In einer Seite oder einem Benutzer Steuerelement wird unloadobject aufgerufen und der Objekt Verweis übergeben.In a Page or UserControl, call UnloadObject and pass in the object reference
  • Ruft Windows. UI. XAML. Markup. xamlmarkuphelper. unloadobject auf und übergibt den Objekt Verweis.Call Windows.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject and pass in the object reference

Wenn ein Objekt entladen wird, wird es in der Struktur durch einen Platzhalter ersetzt.When an object is unloaded, it will be replaced in the tree with a placeholder. Die Objektinstanz verbleibt im Arbeitsspeicher, bis alle Verweise freigegeben wurden.The object instance will remain in memory until all references have been released. Die unloadobject-API auf einer Seite/einem UserControl-Steuerelement wurde entwickelt, um die von CodeGen für x:Name und x:bindbaren Verweise freizugeben.The UnloadObject API on a Page/UserControl is designed to release the references held by codegen for x:Name and x:Bind. Wenn Sie zusätzliche Verweise im App-Code enthalten, müssen Sie auch veröffentlicht werden.If you hold additional references in app code they will also need to be released.

Wenn ein Element entladen wird, werden alle Zustände, die dem Element zugeordnet sind, verworfen. Wenn Sie x:Load als optimierte Version der Sichtbarkeit verwenden, stellen Sie sicher, dass der gesamte Zustand über Bindungen angewendet wird, oder wird durch Code erneut angewendet, wenn das geladene Ereignis ausgelöst wird.When an element is unloaded, all state associated with the element will be discarded, so if using x:Load as an optimized version of Visibility, then ensure all state is applied via bindings, or is re-applied by code when the Loaded event is fired.

BeschränkungenRestrictions

Die folgenden Einschränkungen gelten für die Verwendung von x:Load :The restrictions for using x:Load are:

  • Sie müssen einen x:Name   für das-Element definieren, da es eine Möglichkeit gibt, das-Element zu einem späteren Zeitpunkt zu finden.You must define an x:Name for the element, as there needs to be a way to find the element later.
  • Sie können x:Load nur für Typen verwenden, die von " UIElement " oder " flyoutbase" abgeleitet werden.You can only use x:Load on types that derive from UIElement or FlyoutBase.
  • Sie können x:Load nicht für Stamm Elemente in einer Seite, einem UserControloder einem DataTemplateverwenden.You cannot use x:Load on root elements in a Page, a UserControl, or a DataTemplate.
  • X:Load kann nicht für Elemente in einem ResourceDictionary verwendet werden.You cannot use x:Load on elements in a ResourceDictionary.
  • Sie können x:Load nicht für lose XAML verwenden, die mit XamlReader. Loadgeladen wurde.You cannot use x:Load on loose XAML loaded with XamlReader.Load.
  • Durch das Verschieben eines übergeordneten Elements werden alle Elemente gelöscht, die nicht geladen wurden.Moving a parent element will clear out any elements that have not been loaded.

BemerkungenRemarks

Sie können x:Load für in der Liste eingefügte Elemente verwenden, Sie müssen jedoch über das äußerste Element in realisiert werden.You can use x:Load on nested elements, however they have to be realized from the outer-most element in. Wenn Sie versuchen, ein untergeordnetes Element zu erkennen, bevor das übergeordnete Element erkannt wurde, wird eine Ausnahme ausgelöst. If you try to realize a child element before the parent has been realized, an exception is raised.

In der Regel wird empfohlen, Elemente zurückzustellen, die im ersten Frame nicht angezeigt werden können.Typically, we recommend that you defer elements that are not viewable in the first frame.Bei der Suche nach zu verzögernden Kandidaten empfiehlt es sich, nach Elementen zu suchen, die mit reduzierter Visibility erstellt werden. A good guideline for finding candidates to be deferred is to look for elements that are being created with collapsed Visibility. Außerdem ist die Benutzeroberfläche, die durch Benutzerinteraktion ausgelöst wird, ein guter Ausgangspunkt, um nach Elementen zu suchen, die Sie verzögern können.Also, UI that is triggered by user interaction is a good place to look for elements that you can defer.

Seien Sie vorsichtig, wenn Sie Elemente in einer ListViewverzögern, da dadurch die Startzeit verringert wird, Sie können jedoch auch die Schwenk Leistung verringern, je nachdem, was Sie erstellen.Be wary of deferring elements in a ListView, as it will decrease your startup time, but could also decrease your panning performance depending on what you're creating. Wenn Sie die Schwenk Leistung erhöhen möchten, finden Sie weitere Informationen in der Dokumentation zu {x:Bind} Markup Erweiterung und x:Phase-Attribut .If you are looking to increase panning performance, see the {x:Bind} markup extension and x:Phase attribute documentation.

Wenn das x:Phase-Attribut in Verbindung mit x:Load verwendet wird, und wenn ein Element oder eine Elementstruktur realisiert wird, werden die Bindungen bis einschließlich der aktuellen Phase übernommen.If the x:Phase attribute is used in conjunction with x:Load then, when an element or an element tree is realized, the bindings are applied up to and including the current phase. Die für x:Phase angegebene Phase wirkt sich auf den Ladezustand des Elements aus oder steuert diesen.The phase specified for x:Phase does affect or control the loading state of the element. Wenn ein Listenelement im Rahmen der schwenken wieder verwendet wird, Verhalten sich erkannte Elemente auf die gleiche Weise wie andere aktive Elemente, und kompilierte Bindungen ({x:Bind} -Bindungen) werden mit denselben Regeln, einschließlich der Phasen Verarbeitung, verarbeitet.When a list item is recycled as part of panning, realized elements will behave in the same way as other active elements, and compiled bindings ({x:Bind} bindings) are processed using the same rules, including phasing.

Eine allgemeine Richtlinie besteht darin, die Leistung Ihrer APP vor und nach zu messen, um sicherzustellen, dass Sie die gewünschte Leistung erhalten.A general guideline is to measure the performance of your app before and after to make sure you are getting the performance that you want.

BeispielExample

<StackPanel>
    <Grid x:Name="DeferredGrid" x:Load="False">
        <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="Orange" Margin="0,0,4,4"/>
        <Rectangle Height="100" Width="100" Fill="Green" Grid.Column="1" Margin="4,0,0,4"/>
        <Rectangle Height="100" Width="100" Fill="Blue" Grid.Row="1" Margin="0,4,4,0"/>
        <Rectangle Height="100" Width="100" Fill="Gold" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="one" x:Load="{x:Bind (x:Boolean)CheckBox1.IsChecked, Mode=OneWay}"/>
        <Rectangle Height="100" Width="100" Fill="Silver" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="two" x:Load="{x:Bind Not(CheckBox1.IsChecked), Mode=OneWay}"/>
    </Grid>

    <Button Content="Load elements" Click="LoadElements_Click"/>
    <Button Content="Unload elements" Click="UnloadElements_Click"/>
    <CheckBox x:Name="CheckBox1" Content="Swap Elements" />
</StackPanel>
// This is used by the bindings between the rectangles and check box.
private bool Not(bool? value) { return !(value==true); }

private void LoadElements_Click(object sender, RoutedEventArgs e)
{
    // This will load the deferred grid, but not the nested
    // rectangles that have x:Load attributes.
    this.FindName("DeferredGrid"); 
}

private void UnloadElements_Click(object sender, RoutedEventArgs e)
{
     // This will unload the grid and all its child elements.
     this.UnloadObject(DeferredGrid);
}