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: