Atributo x:DeferLoadStrategy
Importante
A partir do Windows 10, versão 1703 (Atualização para criadores), x:DeferLoadStrategy foi 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 mais informações.
Você pode usar x:DeferLoadStrategy="Lazy" para otimizar o desempenho de inicialização ou criação de árvore do seu aplicativo XAML. Quando você usa x:DeferLoadStrategy="Lazy", a criação de um elemento e seus filhos está 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 de forma pouco frequente ou condicional. O elemento será realizado quando chamado a partir do código ou VisualStateManager.
No entanto, o rastreamento de elementos diferidos 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 uma pegada de memória maior. Portanto, é possível usar esse atributo em excesso até o limite de redução do seu desempenho.
Uso do atributo XAML
<object x:DeferLoadStrategy="Lazy" .../>
Comentários
As restrições para usar x: DeferLoadStrategy são:
- Você deve definir um X:Names para o elemento, uma vez que deve haver uma forma de encontrar o elemento depois.
- Você pode adiar somente tipos derivados de UIElement ou FlyoutBase.
- Você não pode adiar elementos raiz em uma Página, um UserControl, ou um DataTemplate.
- Você não pode adiar elementos em um ResourceDictionary.
- Você não pode adiar o XAML solto carregado com XamlReader.Load.
- Mover um elemento-pai apagará todos os elementos que não tenham sido realizados.
Existem várias maneiras de perceber os elementos diferidos:
- Chame FindName com o nome definido no elemento.
- Chame GetTemplateChild com o nome definido no elemento.
- Em um VisualState, use uma animação Setter ou Storyboard que segmenta o elemento adiado.
- Segmente o elemento adiado em qualquer Storyboard.
- Use uma associação que esteja segmentando o elemento adiado.
OBSERVAÇÃO: Depois que a instanciação de um elemento for iniciada, ele será criado no thread da interface do usuário, de maneira que faça a interface do usuário ser dividida se várias forem criadas de uma só vez.
Depois que um elemento adiado for criado por um dos métodos listados acima, várias coisas acontecerão:
- O evento Loaded no elemento será acionado.
- Todas as associações no elemento serão avaliadas.
- Se o aplicativo tiver se registrado para receber notificações de alteração feita na propriedade sobre a propriedade que contém os elementos adiados, a notificação será acionada.
Você pode aniquilar elementos diferidos, no entanto, eles devem ser realizados a partir do elemento mais externo em. Se você tentar observar um elemento filho antes que o pai tenha sido percebido, uma exceção será gerada.
Normalmente, recomendamos que você adie elementos que não são visíveis no primeiro quadro. Uma boa orientação para encontrar os candidatos a serem diferidos é procurar elementos que estão sendo criados com Visibilidade recolhida. Além disso, a UI que é desencadeada pela interação do usuário é um bom lugar para procurar elementos que você pode adiar.
Seja cauteloso ao adiar elementos em um ListView, pois o tempo de inicialização será menor, mas também o desempenho do movimento panorâmico pode ser reduzido, dependendo do que você está criando. Se você estiver procurando melhorar o desempenho de movimento panorâmico, consulte a documentação sobre extensão de marcação {x: Bind} e 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 atual. A fase especificada para x:Phase não afeta ou controla o adiamento do elemento. Quando um item de lista é reciclado como parte de movimento panorâmico, os elementos realizados da mesma forma que outros elementos ativos e as associações compiladas (associações {x:Bind}) serão processados usando as mesmas regras, incluindo fases.
Uma diretriz geral é avaliar o desempenho do aplicativo antes e depois, para garantir que você obtenha o desempenho que deseja.
Exemplo
<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");
}