Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 mayor sea el árbol de elementos que aplaza, más tiempo de inicio ahorrará, pero a costa de un mayor uso 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 el 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:
- Llame a FindName con el nombre que definió del elemento.
- Utilice GetTemplateChild con el nombre que has definido en el elemento.
- En un VisualState, use una animación Setter o Storyboard que apunte al 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 instanciación de un elemento, se crea en el subproceso de la UI, por lo que podría provocar que la UI se entrecorte 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 las vinculaciones del elemento.
- Si se ha registrado para recibir notificaciones de cambios en la propiedad que incluye los elementos diferidos, se genera una notificación.
Puede anidar elementos diferidos, pero deben realizarse desde el elemento más externo hacia adentro. Si intenta instanciar un elemento secundario antes de que se haya instanciado el elemento padre, 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 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.
Tenga cuidado con aplazar los elementos en un control ListView, ya que aumentará el tiempo de inicio, pero también podría reducir el rendimiento del movimiento panorámico en función de lo que esté 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 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 las vinculaciones compiladas ({x:Bind}) se procesan con las mismas reglas, incluidas las fases de ejecució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");
}