Поделиться через


Схемы пользовательского пространства имен 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 экземпляров:

Кнопки круга