Compartilhar via


Carregar XAML em runtime

Quando uma classe XAML do .NET MAUI(.NET Multi-Platform App UI) é construída, um método LoadFromXaml é chamado indiretamente. Isso ocorre porque o arquivo code-behind de uma classe XAML chama o método InitializeComponent de seu construtor:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

Quando um projeto que contém um arquivo XAML é criado, um gerador de origem gera uma nova fonte C# que contém a InitializeComponent definição do método e a adiciona ao objeto de compilação. O exemplo a seguir mostra o método gerado InitializeComponent para a classe MainPage:

private void InitializeComponent()
{
    global::Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

O método InitializeComponent chama o método LoadFromXaml para extrair o binário compilado XAML (ou seu arquivo) no pacote do aplicativo. Após a extração, ele inicializa todos os objetos definidos no XAML, conecta-os todos juntos em relações pai-filho, anexa manipuladores de eventos definidos no código a eventos definidos no arquivo XAML e define a árvore resultante de objetos como o conteúdo da página.

Carregar XAML em runtime

A classe Extensions, no namespaceMicrosoft.Maui.Controls.Xaml, inclui métodos de extensão LoadFromXaml que podem ser usados para carregar e analisar XAML em runtime. Os métodos LoadFromXaml são public e, portanto, podem ser chamados de aplicativos .NET MAUI para carregar e analisar XAML em runtime. Isso possibilita cenários como um aplicativo baixando XAML de um serviço Web, criando o modo de exibição necessário com base no XAML e exibindo-o no aplicativo.

Aviso

O carregamento do XAML em runtime tem um custo de desempenho significativo e geralmente deve ser evitado.

Aviso

Carregar XAML em runtime não é seguro para corte e não deve ser usado com corte completo ou NativeAOT. Ele pode ser feito com segurança de corte anotando todos os tipos que podem ser carregados em tempo de execução com o DynamicallyAccessedMembers atributo ou o DynamicDependency atributo. No entanto, isso é muito propenso a erros e não é recomendado. Além disso, carregar XAML em tempo de execução tem um custo de desempenho significativo. Para obter mais informações, consulte Cortar um aplicativo .NET MAUI e implantação de AOT nativa.

O exemplo de código a seguir mostra um uso simples:

string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
stackLayout.Add(navigationButton);

Neste exemplo, uma instância Button é criada, com seu valor de propriedade Text sendo definido com base no XAML definido no string. Em seguida, o Button é adicionado a um StackLayout que foi definido no XAML para a página.

Observação

Os métodos de extensão LoadFromXaml permitem que um argumento de tipo genérico seja especificado. No entanto, raramente é necessário especificar o argumento de tipo, pois ele será inferido do tipo da instância em que está operando.

O método LoadFromXaml pode ser usado para inflar qualquer XAML, com o exemplo a seguir inflando um ContentPage e navegando até ele:

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\nxmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\nx:Class=\"LoadRuntimeXAML.CatalogItemsPage\"\nTitle=\"Catalog Items\">\n</ContentPage>";

ContentPage page = new ContentPage().LoadFromXaml(pageXAML);
await Navigation.PushAsync(page);

Acessar elementos

Carregar XAML em runtime com o método LoadFromXaml não permite acesso fortemente tipado aos elementos do XAML que especificaram nomes de objeto de runtime (usando x:Name). No entanto, esses elementos XAML podem ser recuperados usando o método FindByName e, em seguida, acessados conforme necessário:

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\nxmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\nx:Class=\"LoadRuntimeXAML.CatalogItemsPage\"\nTitle=\"Catalog Items\">\n<StackLayout>\n<Label x:Name=\"monkeyName\"\n />\n</StackLayout>\n</ContentPage>";
ContentPage page = new ContentPage().LoadFromXaml(pageXAML);

Label monkeyLabel = page.FindByName<Label>("monkeyName");
monkeyLabel.Text = "Seated Monkey";

Neste exemplo, o XAML para um ContentPage é inflado. Esse XAML inclui um Label chamado monkeyName, que é recuperado usando o método FindByName, antes que a propriedade Text seja definida.