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 hace referencia desde el código o 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 mayor sea el árbol de elementos que aplaza, más tiempo de inicio ahorrará, pero a costa de una mayor superficie de memoria. Por lo tanto, es posible usar este atributo en la medida en que el rendimiento disminuya.
Uso del atributo XAML
<object x:DeferLoadStrategy="Lazy" .../>
Comentarios
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 XAML flexible 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:
- Llame a FindName con el nombre que definió en el elemento .
- Llame a GetTemplateChild con el nombre que definió en el elemento.
- En un objeto VisualState, use una animación Setter o Storyboard que tenga como destino el elemento diferido.
- Dirija el elemento diferido en cualquier guión gráfico.
- Use un enlace que tenga como destino el elemento diferido.
NOTA: Una vez iniciada la creación de instancias de un elemento, se crea en el subproceso de la interfaz de usuario, por lo que podría provocar que la interfaz de usuario se desconombree si se crea demasiado 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 los enlaces del elemento.
- Si se ha registrado para recibir notificaciones de cambio de propiedad en la propiedad que contiene los elementos diferidos, se genera la notificación.
Sin embargo, puede anidar elementos diferidos, pero deben realizarse desde el elemento más externo de . Si intenta realizar un elemento secundario antes de que se haya realizado el elemento primario, se genera una excepción.
Normalmente, se recomienda aplazar los elementos que no se pueden ver en el primer marco. Una buena guía para buscar candidatos a aplazar es buscar elementos que se crean con visibilidad contraída. Además, la interfaz de usuario desencadenada por la interacción del usuario es un buen lugar para buscar elementos que se pueden aplazar.
Tenga cuidado con aplazar los elementos en un control ListView, ya que reducirá el tiempo de inicio, pero también podría reducir el rendimiento del movimiento panorámico en función de lo que cree. 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 se recicla un elemento de lista como parte del movimiento panorámico, los elementos realizados se comportan de la misma manera que otros elementos activos y los enlaces compilados ({x:Bind} ) se procesan con las mismas reglas, incluida la fase.
Una guía general es medir el rendimiento de la aplicación antes y después para asegurarse de obtener el rendimiento que desee.
Ejemplo
<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");
}