attribut x: DeferLoadStrategy

Important

À compter de Windows 10, version 1703 (Creators Update), x :DeferLoadStrategy est remplacé par l’attribut x :Load. L’utilisation x:Load="False" est équivalente à x:DeferLoadStrategy="Lazy", mais offre la possibilité de décharger l’interface utilisateur si nécessaire. Pour plus d’informations, consultez l’attribut x :Load.

Vous pouvez utiliser x :DeferLoadStrategy="Lazy » pour optimiser les performances de démarrage ou de création d’arborescence de votre application XAML. Lorsque vous utilisez x :DeferLoadStrategy="Lazy », la création d’un élément et de ses enfants est retardée, ce qui réduit le temps de démarrage et les coûts de mémoire. Cela est utile pour réduire les coûts des éléments qui sont présentés rarement ou conditionnellement. L’élément est réalisé lorsqu’il est référencé à partir du code ou de VisualStateManager.

Toutefois, 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 affecté. Plus l’arborescence d’éléments que vous reportez, plus vous économiserez de temps de démarrage, mais au coût d’une plus grande empreinte mémoire. Par conséquent, il est possible de surutiliser cet attribut dans la mesure où vos performances diminuent.

Utilisation des attributs XAML

<object x:DeferLoadStrategy="Lazy" .../>

Notes

Les restrictions d’utilisation de x :DeferLoadStrategy sont les suivantes :

  • Vous devez définir un x :Name pour l’élément, car il doit y avoir un moyen de trouver l’élément ultérieurement.
  • Vous ne pouvez différer que les types qui dérivent de UIElement ou FlyoutBase.
  • Vous ne pouvez pas différer les éléments racines d’une page, d’un UserControl ou d’un DataTemplate.
  • Vous ne pouvez pas différer les éléments d’un ResourceDictionary.
  • Vous ne pouvez pas différer le code XAML libre chargé avec XamlReader.Load.
  • Le déplacement d’un élément parent efface tous les éléments qui n’ont pas été réalisés.

Il existe plusieurs façons de réaliser les éléments différés :

  • Appelez FindName avec le nom que vous avez défini sur l’élément.
  • Appelez GetTemplateChild avec le nom que vous avez défini sur l’élément.
  • Dans un VisualState, utilisez une animation Setter ou Storyboard qui cible l’élément différé.
  • Ciblez l’élément différé dans n’importe quel Storyboard.
  • Utilisez une liaison qui cible l’élément différé.

REMARQUE : Une fois l’instanciation d’un élément démarrée, elle est créée sur le thread d’interface utilisateur, de sorte qu’elle peut entraîner l’ébreuxtage de l’interface utilisateur si trop de choses sont créées en même temps.

Une fois qu’un élément différé est créé de l’une des manières répertoriées précédemment, plusieurs choses se produisent :

  • L’événement Loaded sur l’élément est déclenché.
  • Toutes les liaisons sur l’élément sont évaluées.
  • Si vous êtes inscrit pour recevoir des notifications de modification de propriété sur la propriété contenant le ou les éléments différés, la notification est déclenchée.

Vous pouvez imbriquer les éléments différés, mais ils doivent être réalisés à partir de l’élément le plus externe dans.  Si vous essayez de réaliser un élément enfant avant la réalisation du parent, une exception est levée.

En règle générale, nous vous recommandons de différer les éléments qui ne sont pas visibles dans le premier cadre. Une bonne directive pour trouver des candidats à différer consiste à rechercher les éléments qui sont créés avec une visibilité réduite. En outre, l’interface utilisateur déclenchée par l’interaction utilisateur est un bon endroit pour rechercher les éléments que vous pouvez différer.

Méfiez-vous des éléments différés dans un ListView, car il diminue le temps de démarrage, mais peut également diminuer vos performances de panoramique en fonction de ce que vous créez. Si vous envisagez d’augmenter les performances de panoramique, consultez la documentation sur l’extension de balisage {x :Bind} et la documentation sur les attributs x :Phase.

Si l’attribut x :Phase est utilisé conjointement avec x :DeferLoadStrategy, lorsqu’un élément ou une arborescence d’éléments est réalisé, les liaisons sont appliquées jusqu’à la phase actuelle et y compris. La phase spécifiée pour x :Phase n’affecte pas ou ne contrôle pas le report de l’élément. Lorsqu’un élément de liste est recyclé dans le cadre d’un panoramique, 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 phase.

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.

Exemple

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