Compartilhar via


Atributo x:DeferLoadStrategy

Importante

A partir do Windows 10, versão 1703 (Atualização de Criadores), x:DeferLoadStrategy é substituído pelo atributo x:Load. Usar x:Load="False" é equivalente a x:DeferLoadStrategy="Lazy", mas fornece a capacidade de descarregar a interface do usuário, se necessário. Consulte o atributo x:Load para obter mais informações.

Você pode usar x:DeferLoadStrategy="Lazy" para otimizar o desempenho de inicialização ou criação de árvore do aplicativo XAML. Quando você usa x:DeferLoadStrategy="Lazy", a criação de um elemento e seus filhos é atrasada, o que diminui o tempo de inicialização e os custos de memória. Isso é útil para reduzir os custos de elementos que são mostrados com pouca frequência ou condicionalmente. O elemento será realizado quando for mencionado por código ou pelo VisualStateManager.

No entanto, o acompanhamento de elementos adiados pela estrutura XAML adiciona cerca de 600 bytes ao uso de memória para cada elemento afetado. Quanto maior a árvore de elementos que você adiar, mais tempo de inicialização você economizará, mas ao custo de um volume de memória maior. Portanto, é possível usar esse atributo em excesso na medida em que seu desempenho diminui.

Uso do atributo XAML

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

Observações

As restrições para usar x:DeferLoadStrategy são:

  • Você deve definir um x:Name para o elemento, pois precisa haver uma maneira de localizar o elemento mais tarde.
  • Você só pode adiar tipos que derivam de UIElement ou FlyoutBase.
  • Você não pode adiar elementos raiz em uma página, um UserControl ou um DataTemplate.
  • Não é possível adiar elementos em um ResourceDictionary.
  • Você não pode retardar o carregamento de XAML solto com XamlReader.Load.
  • Mover um elemento pai limpará todos os elementos que não foram materializados.

Há várias maneiras diferentes de perceber os elementos adiados:

  • Chame FindName com o nome que você definiu no elemento.
  • Chame GetTemplateChild com o nome que você definiu no elemento.
  • Em um VisualState, use uma animação Setter ou Storyboard direcionada ao elemento adiado.
  • Direcione o elemento adiado em qualquer Storyboard.
  • Use uma vinculação direcionada ao elemento adiado.

OBSERVAÇÃO: Depois que a instanciação de um elemento é iniciada, ele é criado no thread da interface do usuário, podendo fazer com que a interface trave se muitas coisas forem criadas de uma só vez.

Depois que um elemento adiado é criado de qualquer uma das maneiras listadas anteriormente, várias coisas acontecem:

  • O evento Loaded no elemento é acionado.
  • Todas as associações no elemento são avaliadas.
  • Se você tiver se registrado para receber notificações de alteração de propriedade na propriedade que contém os elementos adiados, a notificação será gerada.

Você pode aninhar elementos adiados, no entanto, eles precisam ser realizados a partir do elemento mais externo.  Se você tentar instanciar um elemento filho antes que o elemento pai tenha sido instanciado, uma exceção será gerada.

Normalmente, recomendamos que você adie elementos que não podem ser exibidos no primeiro quadro. Uma boa diretriz para encontrar candidatos a serem adiados é procurar elementos que estão sendo criados com Visibilidade recolhida. Além disso, a interface do usuário ativada pela interação do usuário é um bom local para buscar elementos que você pode adiar.

Desconfie de adiar elementos em um ListView, pois isso diminuirá o tempo de carregamento inicial, mas também poderá diminuir seu desempenho de rolagem dependendo do que você está criando. Se você está procurando aumentar o desempenho de panning, consulte a documentação da extensão de marcação {x:Bind} e do atributo x:Phase.

Se o atributo x:Phase for usado em conjunto com x:DeferLoadStrategy, quando um elemento ou uma árvore de elementos for realizado, as associações serão aplicadas até e incluindo a fase em curso. A fase especificada para x:Phase não afeta nem controla o adiamento do elemento. Quando um item de lista é reciclado como parte do movimento panorâmico, os elementos realizados se comportam da mesma maneira que outros elementos ativos e as associações compiladas (associações{x:Bind} ) são processadas usando as mesmas regras, incluindo a eliminação de fases.

Uma diretriz geral é medir o desempenho do seu aplicativo antes e depois para garantir que você esteja obtendo o desempenho desejado.

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