Compartilhar via


Esquemas de namespace personalizados

Os tipos em uma biblioteca .NET Multi-platform App UI (.NET MAUI) podem ser referenciados em XAML declarando um namespace XML para a biblioteca, com a declaração de namespace especificando o nome do namespace CLR (Common Language Runtime) e um nome de assembly:

<ContentPage ...
             xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
    ...
</ContentPage>

No entanto, especificar um namespace CLR e um nome de assembly em uma xmlns definição pode ser incômodo e propenso a erros. Além disso, várias declarações de namespace XML podem ser necessárias se a biblioteca contiver tipos em vários namespaces.

Uma abordagem alternativa é definir um esquema de namespace personalizado, como http://mycompany.com/schemas/controls, que mapeia para um ou mais namespaces CLR. Isso permite que uma única declaração de namespace XML faça referência a todos os tipos em um assembly, mesmo que eles estejam em namespaces diferentes. Ele também permite que uma única declaração de namespace XML faça referência a tipos em vários assemblies.

Para obter mais informações sobre namespaces XAML, consulte Namespaces XAML.

Definir um esquema de namespace personalizado

Imagine uma biblioteca que expõe alguns controles simples, como CircleButton:

namespace MyCompany.Controls
{
    public class CircleButton : Button
    {
        ...
    }
}

Todos os controles na biblioteca residem no MyCompany.Controls namespace. Esses controles podem ser expostos a um assembly de chamada por meio de um esquema de namespace personalizado.

Um esquema de namespace personalizado é definido com a XmlnsDefinitionAttribute classe, que especifica o mapeamento entre um namespace XAML e um ou mais namespaces CLR. O XmlnsDefinitionAttribute usa dois argumentos: o nome do namespace XAML e o nome do namespace CLR. O nome do namespace XAML é armazenado na propriedade e o nome do XmlnsDefinitionAttribute.XmlNamespace namespace CLR é armazenado na XmlnsDefinitionAttribute.ClrNamespace propriedade.

Observação

A XmlnsDefinitionAttribute classe também tem uma propriedade chamada AssemblyName, que pode ser opcionalmente definida como o nome do assembly. Isso só é necessário quando um namespace CLR referenciado de um está em um XmlnsDefinitionAttribute assembly externo.

O XmlnsDefinitionAttribute deve ser definido no nível de assembly no projeto que contém os namespaces CLR que serão mapeados no esquema de namespace personalizado:

using MyCompany.Controls;

[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]

Esse código cria um esquema de namespace personalizado que mapeia a http://mycompany.com/schemas/controls URL para o MyCompany.Controls namespace CLR.

Importante

Você deve instruir o vinculador a preservar os tipos no assembly que são mapeados por meio do esquema de namespace personalizado ou preservar o assembly inteiro. Para obter mais informações, consulte Preservar código.

O esquema de namespace personalizado pode ser usado para resolução de tipos em arquivos XAML.

Consumir um esquema de namespace personalizado

Para consumir tipos do esquema de namespace personalizado, o compilador XAML requer que haja uma referência de código do assembly que consome os tipos para o assembly que define os tipos. Isso pode ser feito adicionando uma classe contendo um Init método ao assembly que define os tipos que serão consumidos por meio de XAML:

namespace MyCompany.Controls
{
    public static class Controls
    {
        public static void Init()
        {
        }
    }
}

O Init método pode então ser chamado a partir do assembly que consome tipos do esquema de namespace personalizado:

using MyCompany.Controls;

namespace CustomNamespaceSchemaDemo
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            Controls.Init();
            InitializeComponent();
        }
    }
}

Aviso

A falha em incluir essa referência de código resultará na incapacidade do compilador XAML de localizar o assembly que contém os tipos de esquema de namespace personalizados.

Para consumir o CircleButton controle, um namespace XAML é declarado, com a declaração de namespace especificando a URL do esquema de namespace personalizado:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="http://mycompany.com/schemas/controls"
             x:Class="CustomNamespaceSchemaDemo.MainPage">
    <StackLayout>
        ...
        <controls:CircleButton Text="+"
                               BackgroundColor="Fuchsia"
                               BorderColor="Black"
                               CircleDiameter="100" />
        <controls:CircleButton Text="-"
                               BackgroundColor="Teal"
                               BorderColor="Silver"
                               CircleDiameter="70" />
        ...
    </StackLayout>
</ContentPage>

CircleButton As instâncias podem ser adicionadas ContentPage ao declarando-as com o prefixo de controls namespace.

Para localizar os tipos de esquema de namespace personalizados, o .NET MAUI pesquisará instâncias de assemblies XmlnsDefinitionAttribute referenciados. Se o atributo de um elemento em um arquivo XAML corresponder ao valor da XmlNamespace propriedade em um XmlnsDefinitionAttribute, o .NET MAUI tentará usar o xmlnsXmlnsDefinitionAttribute.ClrNamespace valor da propriedade para resolução do tipo. Se a resolução de tipo falhar, o .NET MAUI continuará a tentar a resolução de tipo com base em quaisquer instâncias correspondentes XmlnsDefinitionAttribute adicionais.

O resultado é que duas CircleButton instâncias são exibidas:

Screenshot of two circle buttons.