Esquemas de espacio de nombres personalizados xaml en Xamarin.Forms
Se puede hacer referencia a los tipos de una biblioteca en XAML declarando un espacio de nombres XAML 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 nombre de ensamblado y un espacio de nombres CLR en una xmlns definición puede ser difícil y propenso a errores. Además, pueden ser necesarias varias declaraciones de espacio de nombres XAML si la biblioteca contiene tipos en varios espacios de nombres.
Un enfoque alternativo es definir un esquema de espacio de nombres personalizado, como , que se asigna a http://mycompany.com/schemas/controls uno o varios espacios de nombres CLR. Esto permite que una única declaración de espacio de nombres XAML haga referencia a todos los tipos de un ensamblado, incluso si están en espacios de nombres diferentes. También permite una declaración de espacio de nombres XAML única para hacer referencia a tipos en varios ensamblados.
Para obtener más información sobre los espacios de nombres XAML, vea XAML Namespaces in Xamarin.Forms .
Definición de un esquema de espacio de nombres personalizado
La aplicación de ejemplo contiene una biblioteca que expone algunos controles simples, como CircleButton :
using Xamarin.Forms;
namespace MyCompany.Controls
{
public class CircleButton : Button
{
...
}
}
Todos los controles de la biblioteca residen en el espacio de MyCompany.Controls 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 clase , que especifica la asignación entre un espacio de nombres XAML y uno XmlnsDefinitionAttribute o varios espacios de nombres CLR. toma XmlnsDefinitionAttribute 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 propiedad y el nombre del espacio de nombres XmlnsDefinitionAttribute.XmlNamespace CLR se almacena en la propiedad XmlnsDefinitionAttribute.ClrNamespace .
Nota:
La clase también tiene una propiedad denominada , que se puede establecer XmlnsDefinitionAttributeAssemblyName 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.
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 XmlnsDefinitionAttribute de nombres personalizado. En el ejemplo siguiente se muestra el archivo AssemblyInfo.cs de la aplicación de ejemplo:
using Xamarin.Forms;
using MyCompany.Controls;
[assembly: Preserve]
[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 espacio de nombres MyCompany.Controls CLR. Además, el atributo se especifica en el ensamblado para asegurarse de que el vinculador conserva Preserve todos los tipos del ensamblado.
Importante
El atributo debe aplicarse a las clases del ensamblado que se asignan a través del esquema de espacio de nombres personalizado o se aplican Preserve a todo el ensamblado.
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 desde el ensamblado que consume los tipos hasta el ensamblado que define los tipos. Esto se puede lograr agregando una clase que contiene un método al ensamblado que define los tipos que se consumirán a Init través de XAML:
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
A Init continuación, se puede llamar al método desde el ensamblado que consume tipos del esquema de espacio de nombres personalizado:
using Xamarin.Forms;
using MyCompany.Controls;
namespace CustomNamespaceSchemaDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Controls.Init();
InitializeComponent();
}
}
}
Advertencia
Si no se incluye esta 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 control , se declara un espacio de nombres XAML, donde la declaración de espacio de nombres especifica la dirección URL del esquema de CircleButton espacio de nombres personalizado:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="http://mycompany.com/schemas/controls"
x:Class="CustomNamespaceSchemaDemo.MainPage">
<StackLayout Margin="20,35,20,20">
...
<controls:CircleButton Text="+"
BackgroundColor="Fuchsia"
BorderColor="Black"
CircleDiameter="100" />
<controls:CircleButton Text="-"
BackgroundColor="Teal"
BorderColor="Silver"
CircleDiameter="70" />
...
</StackLayout>
</ContentPage>
CircleButton A continuación, las instancias se pueden agregar a mediante ContentPage su declaración con el prefijo de espacio de nombres controls .
Para buscar los tipos de esquema de espacio de nombres personalizados, buscará instancias de ensamblados a los Xamarin.Forms que se hace XmlnsDefinitionAttribute referencia. Si el atributo de un elemento de un archivo XAML coincide con el valor de propiedad de , intentará usar el valor de xmlns propiedad para la resolución del XmlNamespaceXmlnsDefinitionAttributeXamarin.FormsXmlnsDefinitionAttribute.ClrNamespace tipo. Si se produce un error en la resolución de tipos, seguirá intentando la resolución Xamarin.Forms de tipos en función de las instancias de coincidencia XmlnsDefinitionAttribute adicionales.
El resultado es que se CircleButton muestran dos instancias:

Descarga del ejemplo