Compartir a través de


Esquemas de espacios de nombres personalizados

Se puede hacer referencia a los tipos de una biblioteca de interfaz de usuario de aplicación multiplataforma de .NET (.NET MAUI) en XAML declarando un espacio de nombres XML para la biblioteca, con la declaración de espacio de nombres que especifica el nombre del espacio de nombres de Common Language Runtime (CLR) y un nombre de ensamblado:

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

Sin embargo, especificar un espacio de nombres CLR y un nombre de ensamblado en una xmlns definición puede ser incómodo y propenso a errores. Además, se pueden requerir varias declaraciones de espacio de nombres XML si la biblioteca contiene tipos en varios espacios de nombres.

Un enfoque alternativo consiste en definir un esquema de espacio de nombres personalizado, como http://mycompany.com/schemas/controls, que se asigna a uno o varios espacios de nombres CLR. Esto permite que una sola declaración de espacio de nombres XML haga referencia a todos los tipos de un ensamblado, incluso si están en espacios de nombres diferentes. También permite que una única declaración de espacio de nombres XML haga referencia a tipos en varios ensamblados.

Para obtener más información sobre los espacios de nombres XAML, consulta Espacios de nombres XAML.

Definición de un esquema de espacio de nombres personalizado

Imagine una biblioteca que expone algunos controles simples, como CircleButton:

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

Todos los controles de la biblioteca residen en el MyCompany.Controls espacio de nombres. Estos controles se pueden exponer a un ensamblado de llamada a través de un esquema de espacio de nombres personalizado.

Un esquema de espacio de nombres personalizado se define con la XmlnsDefinitionAttribute clase , que especifica la asignación entre un espacio de nombres XAML y uno o varios espacios de nombres CLR. XmlnsDefinitionAttribute Toma dos argumentos: el nombre del espacio de nombres XAML y el nombre del espacio de nombres CLR. El nombre del espacio de nombres XAML se almacena en la XmlnsDefinitionAttribute.XmlNamespace propiedad y el nombre del espacio de nombres CLR se almacena en la XmlnsDefinitionAttribute.ClrNamespace propiedad .

Nota:

La XmlnsDefinitionAttribute clase también tiene una propiedad denominada AssemblyName, que se puede establecer opcionalmente en el nombre del ensamblado. Esto solo es necesario cuando un espacio de nombres CLR al que se hace referencia desde XmlnsDefinitionAttribute está en un ensamblado externo.

XmlnsDefinitionAttribute Debe definirse en el nivel de ensamblado del proyecto que contiene los espacios de nombres CLR que se asignarán en el esquema de espacio de nombres personalizado:

using MyCompany.Controls;

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

Este código crea un esquema de espacio de nombres personalizado que asigna la http://mycompany.com/schemas/controls dirección URL al MyCompany.Controls espacio de nombres CLR.

Importante

Debe indicar al enlazador que conserve los tipos del ensamblado que se asignan a través del esquema de espacio de nombres personalizado o conservar todo el ensamblado. Para obtener más información, vea Conservar código.

A continuación, el esquema de espacio de nombres personalizado se puede usar para la resolución de tipos en archivos XAML.

Consumo de un esquema de espacio de nombres personalizado

Para consumir tipos del esquema de espacio de nombres personalizado, el compilador XAML requiere que haya una referencia de código del ensamblado que consume los tipos, al ensamblado que define los tipos. Esto se puede lograr agregando una clase que contiene un Init método al ensamblado que define los tipos que se consumirán a través de XAML:

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

A continuación, se puede llamar al Init método desde el ensamblado que consume tipos del esquema de espacio de nombres personalizado:

using MyCompany.Controls;

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

Advertencia

Si no se incluye dicha referencia de código, el compilador XAML no podrá encontrar el ensamblado que contiene los tipos de esquema de espacio de nombres personalizados.

Para consumir el CircleButton control, se declara un espacio de nombres XAML, con la declaración de espacio de nombres que especifica la dirección URL del esquema del espacio de nombres 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 Después, se pueden agregar instancias a mediante ContentPage la declaración con el prefijo del controls espacio de nombres.

Para buscar los tipos de esquema de espacio de nombres personalizados, .NET MAUI buscará ensamblados a los que se hace referencia para XmlnsDefinitionAttribute las instancias. Si el xmlns atributo de un elemento de un archivo XAML coincide con el XmlNamespace valor de propiedad en , XmlnsDefinitionAttribute.NET MAUI intentará usar el valor de propiedad XmlnsDefinitionAttribute.ClrNamespace para la resolución del tipo. Si se produce un error en la resolución de tipos, .NET MAUI seguirá intentando la resolución de tipos en función de cualquier instancia coincidente XmlnsDefinitionAttribute adicional.

El resultado es que se muestran dos CircleButton instancias:

Screenshot of two circle buttons.