Atributo x:DeferLoadStrategy

Importante

A partir de Windows 10, versión 1703 (Creators Update), x:DeferLoadStrategy se sustituye por el atributo x:Load. El uso x:Load="False" es equivalente a x:DeferLoadStrategy="Lazy", pero proporciona la capacidad de descargar la interfaz de usuario si es necesario. Consulte el atributo x:Load para obtener más información.

Puedes usar x:DeferLoadStrategy="Lazy" para optimizar el rendimiento de creación de árboles o inicio de la aplicación XAML. Cuando se usa x:DeferLoadStrategy="Lazy", se retrasa la creación de un elemento y sus elementos secundarios, lo que reduce el tiempo de inicio y los costos de memoria. Esto resulta útil para reducir los costos de los elementos que se muestran con poca frecuencia o condicionalmente. El elemento se realizará cuando se haga referencia a él desde el código o el VisualStateManager.

Sin embargo, el seguimiento de elementos diferidos por el marco XAML agrega aproximadamente 600 bytes al uso de memoria para cada elemento afectado. Cuanto más grande sea el árbol de elementos que aplaces, más tiempo de inicio ahorrarás, pero a costa de un mayor consumo de memoria. Por lo tanto, es posible sobreutilizar este atributo hasta el punto de que el rendimiento disminuya.

Uso de atributos XAML

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

Observaciones

Las restricciones para usar x:DeferLoadStrategy son:

  • Debe definir un x:Name para el elemento, ya que debe haber una manera de encontrar el elemento más adelante.
  • Solo puede aplazar los tipos que derivan de UIElement o FlyoutBase.
  • No se pueden aplazar los elementos raíz en una página, un UserControl o una clase DataTemplate.
  • No se pueden aplazar elementos en un ResourceDictionary.
  • No puedes aplazar código XAML suelto cargado con XamlReader.Load.
  • Al mover un elemento primario se borrarán todos los elementos que no se hayan realizado.

Hay varias maneras diferentes de realizar los elementos diferidos:

  • Llama a FindName con el nombre que hayas definido en el elemento.
  • Utilice GetTemplateChild con el nombre que has definido en el elemento.
  • En un VisualState, utiliza una animación Setter o Storyboard que tenga como destino el elemento diferido.
  • Selecciona el elemento diferido como destino en cualquier Storyboard.
  • Use un enlace que tenga como destino el elemento diferido.

NOTA: Una vez que ha comenzado la instanciación de un elemento, este se crea en el hilo de la interfaz de usuario, por lo que podría provocar que la interfaz de usuario se entrecorte si se crean demasiados elementos a la vez.

Una vez creado un elemento diferido en cualquiera de las formas enumeradas anteriormente, suceden varias cosas:

  • Se genera el evento Loaded en el elemento.
  • Se evalúan las vinculaciones del elemento.
  • Si te has registrado para recibir notificaciones de cambio de propiedad en la propiedad que contiene los elementos diferidos, se generará la notificación.

Puedes anidar elementos diferidos, pero deben materializarse desde el elemento más externo hacia dentro.  Si intentas materializar un elemento hijo antes de que se haya materializado el padre, se generará una excepción.

Normalmente, se recomienda aplazar los elementos que no se pueden ver en el primer marco. Una buena pauta para identificar candidatos a ser diferidos es buscar elementos que se estén creando con la Visibilidad colapsada. Además, la interfaz de usuario desencadenada por la interacción del usuario es un buen lugar para buscar elementos que se pueden aplazar.

Ten cuidado al diferir elementos en un ListView, ya que, aunque reducirá el tiempo de inicio, también podría disminuir el rendimiento del desplazamiento, dependiendo de lo que estés creando. Si desea aumentar el rendimiento del movimiento panorámico, consulte la documentación sobre la extensión de marcado {x:Bind} y el atributo x:Phase .

Si el atributo x:Phase se usa junto con x:DeferLoadStrategy , cuando se realiza un elemento o un árbol de elementos, los enlaces se aplican hasta e incluyen la fase actual. La fase especificada para x:Phase no afecta ni controla el aplazamiento del elemento. Cuando un elemento de la lista se recicla como parte del desplazamiento, los elementos realizados se comportan de la misma manera que otros elementos activos, y los enlaces compilados (enlaces {x:Bind}) se procesan siguiendo las mismas reglas, incluida la sincronización.

Una guía general es medir el rendimiento de la aplicación antes y después para asegurarse de obtener el rendimiento que desee.

Example

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