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