Attribut x:Loadx:Load attribute

Vous pouvez utiliser x :Load pour optimiser le démarrage, la création de l’arborescence d’éléments visuels et l’utilisation de la mémoire de votre application XAML.You can use x:Load to optimize the startup, visual tree creation, and memory usage of your XAML app. L’utilisation de x :Load a un effet visuel similaire à la visibilité, sauf que lorsque l’élément n’est pas chargé, sa mémoire est libérée et, en interne, un petit espace réservé est utilisé pour marquer son emplacement dans l’arborescence d’éléments visuels.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.

L’élément d’interface utilisateur attribué avec x :Load peut être chargé et déchargé par le biais du code, ou à l’aide d’une expression x :bind .The UI element attributed with x:Load can be loaded and unloaded via code, or using an x:Bind expression. Cela permet de réduire les coûts des éléments qui s’affichent rarement ou de manière conditionnelle.This is useful to reduce the costs of elements that are shown infrequently or conditionally. Lorsque vous utilisez x :Load sur un conteneur tel que Grid ou StackPanel, le conteneur et tous ses enfants sont chargés ou déchargés en tant que groupe.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.

Le suivi des éléments différés par l’infrastructure XAML ajoute environ 600 octets à l’utilisation de la mémoire pour chaque élément attribué avec x :Load, pour tenir compte de l’espace réservé.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. Par conséquent, il est possible d’abuser de cet attribut dans la mesure où vos performances diminuent réellement.Therefore, it's possible to overuse this attribute to the extent that your performance actually decreases. Nous vous recommandons de l’utiliser uniquement sur les éléments qui doivent être masqués.We recommend that you only use it on elements that need to be hidden. Si vous utilisez x :Load sur un conteneur, la charge est payée uniquement pour l’élément avec l’attribut x :Load.If you use x:Load on a container, then the overhead is paid only for the element with the x:Load attribute.

Important

L’attribut x :Load est disponible à partir de Windows 10, version 1703 (Creators Update).The x:Load attribute is available starting in Windows 10, version 1703 (Creators Update). La version minimale ciblée par votre projet Visual Studio doit être Windows 10 Creators Update (10,0, Build 15063) pour pouvoir utiliser x :Load.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.

Utilisation des attributs XAMLXAML attribute usage

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

Charger des élémentsLoading Elements

Il existe plusieurs façons de charger les éléments :There are several different ways to load the elements:

  • Utilisez une expression x :bind pour spécifier l’état de chargement.Use an x:Bind expression to specify the load state. L’expression doit retourner true pour charger et false pour décharger l’élément.The expression should return true to load and false to unload the element.
  • Appelez FindName avec le nom que vous avez défini sur l’élément.Call FindName with the name that you defined on the element.
  • Appelez GetTemplateChild avec le nom que vous avez défini sur l’élément.Call GetTemplateChild with the name that you defined on the element.
  • Dans un VisualState, utilisez une animation Setter ou Storyboard qui cible l’élément x :Load.In a VisualState, use a Setter or Storyboard animation that targets the x:Load element.
  • Ciblez l’élément déchargé dans une table de montage séquentiel.Target the unloaded element in any Storyboard.

NOTE : une fois que l’instanciation d’un élément a démarré, celui-ci est créé sur le thread de l’interface utilisateur, au risque que celle-ci s’interrompe si ce qui est créé en une fois est trop important.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.

Une fois qu’un élément différé est créé dans l’une des manières mentionnées précédemment, plusieurs choses se produisent :Once a deferred element is created in any of the ways listed previously, several things happen:

  • L’événement Loaded est déclenché sur l’élément.The Loaded event on the element is raised.
  • Le champ de x :Name est défini.The field for x:Name is set.
  • Toutes les liaisons x :Bind sur l’élément sont évaluées.Any x:Bind bindings on the element are evaluated.
  • Si vous vous êtes inscrit pour recevoir des notifications de modification de propriété sur la propriété contenant les éléments différés, la notification est déclenchée.If you have registered to receive property change notifications on the property containing the deferred element(s), the notification is raised.

Déchargement des élémentsUnloading elements

Pour décharger un élément :To unload an element:

  • Utilisez une expression x :Bind pour spécifier l’état de chargement.Use an x:Bind expression to specify the load state. L’expression doit retourner true pour charger et false pour décharger l’élément.The expression should return true to load and false to unload the element.
  • Dans une page ou un UserControl, appelez UnloadObject et transmettez la référence d’objetIn a Page or UserControl, call UnloadObject and pass in the object reference
  • Appeler Windows. UI. Xaml. Markup. XamlMarkupHelper. UnloadObject et passer la référence d’objetCall Windows.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject and pass in the object reference

Lorsqu’un objet est déchargé, il est remplacé dans l’arborescence par un espace réservé.When an object is unloaded, it will be replaced in the tree with a placeholder. L’instance d’objet reste en mémoire jusqu’à ce que toutes les références aient été libérées.The object instance will remain in memory until all references have been released. L’API UnloadObject sur un contrôle page/UserControl est conçue pour libérer les références détenues par CodeGen pour x :Name et x :Bind.The UnloadObject API on a Page/UserControl is designed to release the references held by codegen for x:Name and x:Bind. Si vous conservez des références supplémentaires dans le code d’application, elles doivent également être publiées.If you hold additional references in app code they will also need to be released.

Lorsqu’un élément est déchargé, tout l’état associé à l’élément est ignoré. par conséquent, si vous utilisez x :Load en tant que version optimisée de la visibilité, vous vérifiez que tout l’État est appliqué via des liaisons ou qu’il est réappliqué par le code lorsque l’événement chargé est déclenché.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.

RestrictionsRestrictions

Les restrictions liées à l’utilisation de x :Load sont les suivantes :The restrictions for using x:Load are:

  • Vous devez définir un x :Name   pour l’élément, car il doit exister un moyen de Rechercher l’élément ultérieurement.You must define an x:Name for the element, as there needs to be a way to find the element later.
  • Vous pouvez uniquement utiliser x :Load sur les types qui dérivent de UIElement ou FlyoutBase.You can only use x:Load on types that derive from UIElement or FlyoutBase.
  • Vous ne pouvez pas utiliser x :Load sur les éléments racine dans une page, un UserControlou un DataTemplate.You cannot use x:Load on root elements in a Page, a UserControl, or a DataTemplate.
  • Vous ne pouvez pas utiliser x :Load sur les éléments d’un ResourceDictionary.You cannot use x:Load on elements in a ResourceDictionary.
  • Vous ne pouvez pas utiliser x :Load sur du code XAML libre chargé avec XamlReader. Load.You cannot use x:Load on loose XAML loaded with XamlReader.Load.
  • Le déplacement d’un élément parent efface tous les éléments qui n’ont pas été chargés.Moving a parent element will clear out any elements that have not been loaded.

RemarquesRemarks

Vous pouvez utiliser x :Load sur les éléments imbriqués, mais ils doivent être obtenus à partir de l’élément le plus externe dans.You can use x:Load on nested elements, however they have to be realized from the outer-most element in. Si vous essayez de réaliser un élément enfant avant que le parent soit réalisé, une exception est levée. If you try to realize a child element before the parent has been realized, an exception is raised.

En règle générale, nous vous recommandons de différer les éléments qui ne sont pas visibles dans le premier frame.Typically, we recommend that you defer elements that are not viewable in the first frame.Une bonne indication pour la recherche des candidats à retarder consiste à rechercher les éléments qui sont créés avec une visibilitéréduite. A good guideline for finding candidates to be deferred is to look for elements that are being created with collapsed Visibility. En outre, l’interface utilisateur qui est déclenchée par l’intervention de l’utilisateur est un bon emplacement pour rechercher les éléments que vous pouvez différer.Also, UI that is triggered by user interaction is a good place to look for elements that you can defer.

Méfiez-vous du report des éléments dans un ListView, car cela réduit le temps de démarrage, mais peut également réduire vos performances de panorama en fonction de ce que vous créez.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. Si vous cherchez à augmenter les performances de panorama, consultez la documentation sur l' extension de balisage {x :bind} et l' attribut x :phase .If you are looking to increase panning performance, see the {x:Bind} markup extension and x:Phase attribute documentation.

Si l' attribut x :phase est utilisé conjointement avec x :Load , quand un élément ou une arborescence d’éléments est réalisé, les liaisons sont appliquées jusqu’à la phase actuelle, y compris.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. La phase spécifiée pour x :phase affecte ou contrôle l’état de chargement de l’élément.The phase specified for x:Phase does affect or control the loading state of the element. Lorsqu’un élément de liste est recyclé dans le cadre de la panoramisation, les éléments réalisés se comportent de la même façon que d’autres éléments actifs, et les liaisons compilées ({x :bind} Bindings) sont traitées à l’aide des mêmes règles, y compris la mise à l’étape.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.

Une recommandation générale consiste à mesurer les performances de votre application avant et après pour vous assurer que vous obtenez les performances souhaitées.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.

ExempleExample

<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);
}