Processamento XAML

O XAML da interface do usuário de aplicativo de várias plataformas do .NET (.NET MAUI) pode ser processado e inflado em uma árvore de objetos de diferentes maneiras explicadas aqui. A partir do .NET 10, a inflação padrão é durante o tempo de execução para compilações de depuração, e XamlC (XamlCompilation) para liberações. Incentivamos você a experimentar a geração de origem e usá-la se ela funcionar para você. Isso se tornará o futuro em novos projetos e, em breve, em todos os projetos.

Compilação XAML

O XAML é compilado diretamente em IL (linguagem intermediária) com o compilador XAML (XAMLC). A compilação XAML oferece uma série de benefícios:

  • Ele executa a verificação em tempo de compilação de XAML, notificando você de quaisquer erros.
  • Ele remove parte do tempo de carregamento e instanciação para elementos XAML.
  • Ajuda a reduzir o tamanho do arquivo do assembly final ao deixar de incluir arquivos .xaml.

A compilação XAML é habilitada por padrão em aplicativos MAUI do .NET. Para aplicativos criados usando a configuração de depuração, a compilação XAML fornece a validação em tempo de compilação do XAML, mas não converte o XAML em IL no assembly. Em vez disso, os arquivos XAML são incluídos como recursos inseridos no pacote do aplicativo e avaliados em runtime. Para aplicativos criados usando a configuração de liberação, a compilação XAML fornece a validação em tempo de compilação do XAML e converte o XAML em IL que é gravado no assembly. No entanto, o comportamento da compilação XAML pode ser substituído em ambas as configurações com a classe XamlCompilationAttribute.

Importante

As associações compiladas podem ser habilitadas para melhorar o desempenho da associação de dados em aplicativos MAUI do .NET. Para obter mais informações, consulte Associações Compiladas.

Inflação de runtime XAML

O XAML pode ser inflado no Runtime usando reflexão. Ele possui vantagens, como permitir o cenário de Recarregamento a Quente (Recarga Dinâmica), reduzir os tempos de build e possibilitar o relatório de diagnósticos para o IDE. No entanto, normalmente, esse método deve ser evitado porque também é o mais lento e os erros de sintaxe são capturados apenas em runtime.

Geração de Origem XAML

A partir do .NET 10, o XAML pode ser transformado em código C# no momento da compilação. Ele oferece os seguintes benefícios:

  • Consistência: o mesmo código gerado usado em Depuração e Versão
  • Velocidade: os tempos de inflação no dispositivo são 10.000% (100 vezes) mais rápidos no modo Depuração e 25% mais rápidos no modo Liberação. O volume de alocação é reduzido na mesma proporção
  • Depuração: você pode ver o código gerado, interrompê-lo e depurá-lo.

Essa é a maneira recomendada de ir mais longe. Ele será habilitado por padrão no futuro.

Habilitar a geração de código-fonte e as configurações por arquivo

Não é mais recomendável usar [XamlCompilation] o atributo para habilitar ou desabilitar por compilação de arquivo.

Você pode habilitar a geração de origem XAML no nível do projeto, definindo o valor de MauiXamlInflator para SourceGen em seu arquivo csproj, conforme mostrado aqui:

<MauiXamlInflator>SourceGen</MauiXamlInflator>

Isso usará a geração de código-fonte para as configurações de Release e Debug, para todos os arquivos.

Você pode reverter para o padrão por arquivo (ou usar curingas) ou forçar outro inflador

<ItemGroup>
    <MauiXaml Update="MyFile.xaml" Inflator="SourceGen" />        <!-- enable sourcegen on a single file. prefer setting it at project level -->
    <MauiXaml Update="Controls\**.xaml" Inflator="Default" />     <!-- revert to defaults for all XAML in Controls. as of .NET 10, default is XamlC for Release, Runtime for Debug -->
    <MauiXaml Update="Controls\**.xaml" Inflator="Runtime" />     <!-- force runtime inflation. if you have to do this, it probably indicates a bug in both XamlC and sourcegen, please report -->
</ItemGroup>

Há outros metadados que você pode definir para instruir o sourcegenerator xaml

<ItemGroup>
    <MauiXaml Update="MyFile.xaml" Inflator="SourceGen" NoWarn="0612;0618" />   <!-- prevent the compiler to fail if the xaml use deprecated API -->
</ItemGroup>

C# em linha com a diretiva x:Code

Quando a geração de origem XAML estiver habilitada, você poderá usar a x:Code diretiva para inserir um pequeno bloco de C# diretamente dentro de um arquivo XAML. O gerador de código-fonte XAML extrai o código e o insere na classe parcial gerada para a página ou modo de exibição, de modo que os membros declarados inline se comportem exatamente como se tivessem sido declarados em um arquivo de código subjacente.

x:Code destina-se a uma cola local de exibição curta, como um único manipulador de eventos ou um auxiliar privado , ela permite manter esse código ao lado da marcação que ele serve sem adicionar um código-atrás parcial separado. Para qualquer coisa maior, prefira um arquivo code-behind dedicado.

Importante

x:Code é um recurso de visualização. Para usá-la, defina a propriedade MSBuild EnablePreviewFeatures como true no seu arquivo de projeto:

<PropertyGroup>
  <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>

O x:Code elemento deve ser um filho direto do elemento raiz e o elemento raiz deve ter um x:Class atributo. Embrulhe o código em uma seção CDATA para que o XAML não tente analisá-lo como marcação:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.MainPage">
    <x:Code>
        <![CDATA[
        using System.Diagnostics;

        void OnButtonClicked(object sender, EventArgs e)
        {
            Debug.WriteLine("Clicked from inline x:Code.");
        }
        ]]>
    </x:Code>

    <Button Text="Click me"
            Clicked="OnButtonClicked" />
</ContentPage>

using As diretivas em um bloco x:Code são movidas para o topo do arquivo gerado, enquanto todo o restante é gerado como membros da classe parcial da página. O gerador de origem relata o seguinte diagnóstico quando x:Code é usado incorretamente:

  • MAUIX2015 — o x:Code elemento não é um filho direto da raiz.
  • MAUIX2016 — o elemento raiz não tem um x:Class atributo.