Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Você pode usar x:Load para otimizar a inicialização, a criação de árvore visual e o uso de memória do aplicativo XAML. Usar x:Load tem um efeito visual semelhante ao Visibility, exceto que quando o elemento não é carregado, sua memória é liberada e um pequeno espaço reservado internamente é usado para marcar seu lugar na árvore visual.
O elemento de interface do usuário atribuído com x:Load pode ser carregado e descarregado por meio de código ou usando uma expressão x:Bind . Isso é útil para reduzir os custos de elementos que são mostrados com pouca frequência ou condicionalmente. Quando você usa x:Load em um contêiner como Grid ou StackPanel, o contêiner e todos os seus filhos são carregados ou descarregados como um grupo.
O acompanhamento de elementos adiados pela estrutura XAML adiciona cerca de 600 bytes ao uso de memória para cada elemento atribuído com x:Load, para considerar o espaço reservado. Portanto, é possível usar esse atributo em excesso na medida em que seu desempenho realmente diminui. Recomendamos que você o use apenas em elementos que precisam ser ocultos. Se você usar x:Load em um contêiner, a sobrecarga será paga apenas pelo elemento com o atributo x:Load.
Importante
O atributo x:Load está disponível a partir do Windows 10, versão 1703 (Atualização dos Criadores). A versão mínima direcionada ao seu projeto do Visual Studio deve ser a Atualização para Criadores do Windows 10 (10.0, Build 15063) para poder usar x:Load.
Uso do atributo XAML
<object x:Load="True" .../>
<object x:Load="False" .../>
<object x:Load="{x:Bind Path.to.a.boolean, Mode=OneWay}" .../>
Carregando elementos
Há várias maneiras diferentes de carregar os elementos:
- Use uma expressão x:Bind para especificar o estado de carga. A expressão deve retornar true para carregar e false para descarregar o elemento.
- 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 x:Load.
- Direcione o elemento não carregado em qualquer Storyboard.
Observação
Depois que a instanciação de um elemento for iniciada, ela será criada no thread de interface do usuário, o que pode fazer a interface apresentar lentidão se muita coisa for criada ao mesmo tempo.
Depois que um elemento adiado é criado de qualquer uma das maneiras listadas anteriormente, várias coisas acontecem:
- O evento Loaded no elemento é acionado.
- O campo para x:Name está definido.
- Todas as associações x:Bind no elemento são aplicadas.
- 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.
Descarregando elementos
Para descarregar um elemento:
- Use uma expressão x:Bind para especificar o estado de carga. A expressão deve retornar true para carregar e false para descarregar o elemento.
- Em uma página ou UserControl, chame UnloadObject e passe a referência do objeto
- Chame Microsoft.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject e passe a referência do objeto
Quando um objeto é descarregado, ele será substituído na árvore por um espaço reservado. A instância do objeto permanecerá na memória até que todas as referências tenham sido liberadas. A API UnloadObject em uma página/UserControl foi projetada para liberar as referências mantidas pelo codegen para x:Name e x:Bind. Se você tiver referências adicionais no código do aplicativo, elas também precisarão ser liberadas.
Quando um elemento é descarregado, todo o estado associado ao elemento será descartado, portanto, se estiver usando x:Load como uma versão otimizada do Visibility, verifique se todo o estado é aplicado por meio de associações ou será novamente aplicado por código quando o evento Loaded for acionado.
Restrictions
As restrições para usar x:Load 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 usar x:Load em tipos que derivam de UIElement ou FlyoutBase.
- Você não pode usar x:Load em elementos raiz em uma página, um UserControl ou um DataTemplate.
- Você não pode usar x:Load em elementos em um ResourceDictionary.
- Você não pode usar x:Load em XAML flexível carregado com XamlReader.Load.
- Mover um elemento pai removerá quaisquer elementos que não tenham sido carregados.
Observações
Você pode usar x:Load em elementos aninhados; no entanto, eles precisam ser instanciados a partir do elemento mais externo para dentro. 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:Load, então, 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 afeta ou controla o estado de carregamento do elemento. Quando um item de lista é reciclado como parte da rolagem panorâmica, os elementos realizados se comportam da mesma forma que outros elementos ativos, e os vínculos compilados ({x:Bind} associações) são processados usando as mesmas regras, incluindo o faseamento.
Uma diretriz geral é medir o desempenho do seu aplicativo antes e depois para garantir que você esteja obtendo o desempenho desejado.
Para minimizar as alterações de comportamento (além do desempenho) ao adicionar x:Load a um elemento, as associações x:Bind são calculadas em seus horários normais, como se nenhum elemento fosse usado x:Load. Por exemplo, as associações OneTime x:Bind são calculadas quando o elemento raiz é carregado. Se o elemento não for instanciado quando a associação x:Bind for calculada, o valor calculado será salvo e aplicado ao elemento quando ele for carregado. Esse comportamento pode ser surpreendente se você esperava que as associações x:Bind fossem calculadas quando o elemento fosse realizado.
Example
<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);
}
Windows developer