Схемы пользовательского пространства имен XAML в Xamarin.Forms
Типы в библиотеке можно ссылаться на XAML, объявив пространство имен XAML для библиотеки с объявлением пространства имен, указав имя пространства имен clR и имя сборки:
<ContentPage ...
xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
...
</ContentPage>
Однако указание пространства имен СРЕДЫ CLR и имени сборки в xmlns
определении может быть неловким и подверженным ошибкам. Кроме того, может потребоваться несколько объявлений пространства имен XAML, если библиотека содержит типы в нескольких пространствах имен.
Альтернативный подход — определить схему пользовательского пространства имен, например http://mycompany.com/schemas/controls
, которая сопоставляется с одним или несколькими пространствами имен CLR. Это позволяет одному объявлению пространства имен XAML ссылаться на все типы сборки, даже если они находятся в разных пространствах имен. Кроме того, это позволяет одному объявлению пространства имен XAML ссылаться на типы в нескольких сборках.
Дополнительные сведения о пространствах имен XAML см. в Xamarin.Formsразделе "Пространства имен XAML".
Определение схемы пользовательского пространства имен
Пример приложения содержит библиотеку, которая предоставляет некоторые простые элементы управления, такие как CircleButton
:
using Xamarin.Forms;
namespace MyCompany.Controls
{
public class CircleButton : Button
{
...
}
}
Все элементы управления в библиотеке MyCompany.Controls
находятся в пространстве имен. Эти элементы управления можно предоставить вызывающей сборке с помощью схемы пользовательского пространства имен.
Схема пользовательского пространства имен определяется классом XmlnsDefinitionAttribute
, который указывает сопоставление между пространством имен XAML и одним или несколькими пространствами имен CLR. Принимает XmlnsDefinitionAttribute
два аргумента: имя пространства имен XAML и имя пространства имен CLR. Имя пространства имен XAML хранится в свойстве XmlnsDefinitionAttribute.XmlNamespace
, а имя пространства имен CLR хранится в свойстве XmlnsDefinitionAttribute.ClrNamespace
.
Примечание.
Класс XmlnsDefinitionAttribute
также имеет свойство с именем AssemblyName
, которое можно при необходимости задать имя сборки. Это необходимо только в том случае, если пространство имен СРЕДЫ CLR, на который ссылается ссылка, XmlnsDefinitionAttribute
находится во внешней сборке.
Необходимо XmlnsDefinitionAttribute
определить на уровне сборки проекта, содержащего пространства имен СРЕДЫ CLR, которые будут сопоставлены в схеме пользовательского пространства имен. В следующем примере показан файл AssemblyInfo.cs из примера приложения:
using Xamarin.Forms;
using MyCompany.Controls;
[assembly: Preserve]
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]
Этот код создает схему http://mycompany.com/schemas/controls
пользовательского пространства имен, которая сопоставляет URL-адрес с пространством MyCompany.Controls
имен CLR. Кроме того, Preserve
атрибут указан в сборке, чтобы компоновщик сохранял все типы в сборке.
Внимание
Атрибут Preserve
должен применяться к классам в сборке, сопоставленной с помощью схемы пользовательского пространства имен, или применяться ко всей сборке.
Затем для разрешения типов в XAML-файлах можно использовать схему пользовательского пространства имен.
Использование схемы пользовательского пространства имен
Чтобы использовать типы из схемы пользовательского пространства имен, компилятор XAML требует, чтобы из сборки, использующую типы, в сборку, определяющую типы. Это можно сделать, добавив класс, Init
содержащий метод в сборку, которая определяет типы, которые будут использоваться с помощью XAML:
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
Затем Init
метод можно вызвать из сборки, которая использует типы из схемы пользовательского пространства имен:
using Xamarin.Forms;
using MyCompany.Controls;
namespace CustomNamespaceSchemaDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Controls.Init();
InitializeComponent();
}
}
}
Предупреждение
Сбой включения такой ссылки на код приведет к тому, что компилятор XAML не сможет найти сборку, содержащую типы схем пользовательского пространства имен.
Чтобы использовать CircleButton
элемент управления, объявляется пространство имен XAML с объявлением пространства имен, указывающим URL-адрес схемы пользовательского пространства имен:
<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
Затем экземпляры можно добавить в ContentPage
них, объявив их controls
префиксом пространства имен.
Чтобы найти типы схем пользовательского пространства имен, Xamarin.Forms будут выполнять поиск по ссылочным сборкам для XmlnsDefinitionAttribute
экземпляров. xmlns
Если атрибут элемента в XAML-файле соответствует XmlNamespace
значению свойства в объектеXmlnsDefinitionAttribute
, Xamarin.Forms попытается использовать XmlnsDefinitionAttribute.ClrNamespace
значение свойства для разрешения типа. Если разрешение типов завершается ошибкой, Xamarin.Forms будет продолжать пытаться разрешить тип на основе любых дополнительных экземпляров сопоставления XmlnsDefinitionAttribute
.
Результатом является отображение двух CircleButton
экземпляров: