Atributo x:Loadx:Load attribute

Puede usar x:Load para optimizar el inicio, la creación de árboles visuales y el uso de memoria de la aplicación XAML.You can use x:Load to optimize the startup, visual tree creation, and memory usage of your XAML app. El uso de x:Load tiene un efecto visual similar a la visibilidad, salvo que cuando el elemento no se carga, su memoria se libera y internamente se usa un marcador de posición pequeño para marcar su lugar en el árbol visual.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.

El elemento de la interfaz de usuario con atributos x:Load se puede cargar y descargar mediante código o mediante una expresión x:Bind .The UI element attributed with x:Load can be loaded and unloaded via code, or using an x:Bind expression. Esto resulta útil para reducir los costos de los elementos que se muestran con poca frecuencia o de manera condicional.This is useful to reduce the costs of elements that are shown infrequently or conditionally. Cuando se usa x:Load en un contenedor como Grid o StackPanel, el contenedor y todos sus elementos secundarios se cargan o descargan como un grupo.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.

El seguimiento de los elementos diferidos por el marco XAML agrega aproximadamente 600 bytes al uso de memoria para cada elemento con el atributo x:Load, para tener en cuenta el marcador de posición.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. Por lo tanto, es posible utilizar este atributo en la medida en que el rendimiento disminuye realmente.Therefore, it's possible to overuse this attribute to the extent that your performance actually decreases. Se recomienda usarlo únicamente en los elementos que deban ocultarse.We recommend that you only use it on elements that need to be hidden. Si usa x:Load en un contenedor, la sobrecarga solo se paga por el elemento con el atributo x:Load.If you use x:Load on a container, then the overhead is paid only for the element with the x:Load attribute.

Importante

El atributo x:Load está disponible a partir de Windows 10, versión 1703 (Creators Update).The x:Load attribute is available starting in Windows 10, version 1703 (Creators Update). La versión mínima de destino de su proyecto de Visual Studio debe ser Windows 10 Creators Update (10,0, compilación 15063) para poder usar 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.

Uso del atributo XAMLXAML attribute usage

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

Cargar elementosLoading Elements

Hay varias maneras de cargar los elementos:There are several different ways to load the elements:

  • Use una expresión x:Bind para especificar el estado de carga.Use an x:Bind expression to specify the load state. La expresión debe devolver true para cargar y false para descargar el elemento.The expression should return true to load and false to unload the element.
  • Llame a FindName con el nombre que ha definido en el elemento.Call FindName with the name that you defined on the element.
  • Llame a GetTemplateChild con el nombre que ha definido en el elemento.Call GetTemplateChild with the name that you defined on the element.
  • En un VisualState, use un establecedor o una animación de guion gráfico que tenga como destino el elemento x:Load.In a VisualState, use a Setter or Storyboard animation that targets the x:Load element.
  • El destino es el elemento descargado en cualquier guion gráfico.Target the unloaded element in any Storyboard.

NOTA: una vez iniciada la creación de instancias de un elemento, se crea en el subproceso de la interfaz de usuario, lo que podría provocar problemas de estabilidad en la interfaz de usuario si se crean demasiados al mismo tiempo.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.

Una vez que se crea un elemento diferido en cualquiera de las formas enumeradas anteriormente, suceden varias cosas:Once a deferred element is created in any of the ways listed previously, several things happen:

  • Se genera el evento Loaded en el elemento.The Loaded event on the element is raised.
  • Se establece el campo de x:Name.The field for x:Name is set.
  • Se evalúa cualquier enlace x:Bind del elemento.Any x:Bind bindings on the element are evaluated.
  • Si se ha registrado para recibir notificaciones de cambio de propiedad en la propiedad que contiene los elementos aplazados, se genera la notificación.If you have registered to receive property change notifications on the property containing the deferred element(s), the notification is raised.

Descargar elementosUnloading elements

Para descargar un elemento:To unload an element:

  • Use una expresión x:Bind para especificar el estado de carga.Use an x:Bind expression to specify the load state. La expresión debe devolver true para cargar y false para descargar el elemento.The expression should return true to load and false to unload the element.
  • En una página o UserControl, llame a UnloadObject y pase la referencia de objeto.In a Page or UserControl, call UnloadObject and pass in the object reference
  • Llamar a Windows. UI. Xaml. Markup. XamlMarkupHelper. UnloadObject y pasar la referencia de objetoCall Windows.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject and pass in the object reference

Cuando se descarga un objeto, se reemplazará en el árbol con un marcador de posición.When an object is unloaded, it will be replaced in the tree with a placeholder. La instancia del objeto permanecerá en la memoria hasta que se hayan liberado todas las referencias.The object instance will remain in memory until all references have been released. La API de UnloadObject en una página/UserControl está diseñada para liberar las referencias contenidas por CODEGEN para x:Name y 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 contiene referencias adicionales en el código de la aplicación, también necesitarán liberarse.If you hold additional references in app code they will also need to be released.

Cuando se descarga un elemento, se descarta todo el estado asociado al elemento, por lo que si se usa x:Load como una versión optimizada de visibilidad, se garantiza que todos los Estados se apliquen a través de los enlaces o que el código vuelva a aplicarlo cuando se desencadene el evento Loaded.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.

RestriccionesRestrictions

Las restricciones para el uso de x:Load son las siguientes:The restrictions for using x:Load are:

  • Debe definir un x:Name   para el elemento, ya que debe haber una manera de encontrar el elemento más adelante.You must define an x:Name for the element, as there needs to be a way to find the element later.
  • Solo se puede usar x:Load en tipos que derivan de UIElement o FlyoutBase.You can only use x:Load on types that derive from UIElement or FlyoutBase.
  • No se puede usar x:Load en los elementos raíz de una página, un control UserControlo un DataTemplate.You cannot use x:Load on root elements in a Page, a UserControl, or a DataTemplate.
  • No se puede usar x:Load en los elementos de un ResourceDictionary.You cannot use x:Load on elements in a ResourceDictionary.
  • No se puede usar x:Load en el código XAML dinámico cargado con XamlReader. Load.You cannot use x:Load on loose XAML loaded with XamlReader.Load.
  • Al mover un elemento primario, se borrarán todos los elementos que no se hayan cargado.Moving a parent element will clear out any elements that have not been loaded.

ObservacionesRemarks

Puede usar x:Load en elementos anidados, sin embargo, se deben realizar desde el elemento más externo en.You can use x:Load on nested elements, however they have to be realized from the outer-most element in. Si intenta obtener un elemento secundario antes de que se haya realizado el elemento primario, se produce una excepción. If you try to realize a child element before the parent has been realized, an exception is raised.

Normalmente, se recomienda aplazar los elementos que no se pueden ver en el primer fotograma.Typically, we recommend that you defer elements that are not viewable in the first frame.Una buena opción para encontrar candidatos a ser aplazados es buscar elementos que se vayan a crear con Visibility contraída. A good guideline for finding candidates to be deferred is to look for elements that are being created with collapsed Visibility. Además, la interfaz de usuario desencadenada por la interacción con el usuario es un buen lugar para buscar los elementos que se pueden aplazar.Also, UI that is triggered by user interaction is a good place to look for elements that you can defer.

Tenga cuidado al aplazar elementos en un control ListView, ya que disminuirá el tiempo de inicio, pero también puede reducir el rendimiento de la panorámica en función de lo que esté creando.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 desea aumentar el rendimiento de la panorámica, consulte la documentación de la extensión de marcado {x:Bind} y el atributo x:Phase .If you are looking to increase panning performance, see the {x:Bind} markup extension and x:Phase attribute documentation.

Si el atributo x:Phase se usa junto con x:Load , cuando se realiza un elemento o un árbol de elementos, los enlaces se aplican hasta la fase actual, inclusive.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 fase especificada para x:Phase afecta o controla el estado de carga del elemento.The phase specified for x:Phase does affect or control the loading state of the element. Cuando un elemento de lista se recicla como parte de la panorámica, los elementos realizados se comportarán de la misma manera que otros elementos activos y los enlaces compilados ({x:Bind} bindings) se procesan con las mismas reglas, incluido el escalonamiento.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.

Una directriz general es medir el rendimiento de la aplicación antes y después para asegurarse de que obtiene el rendimiento que desea.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.

EjemploExample

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