Vlastní schémata oboru názvů XAML v Xamarin.Forms
Typy v knihovně lze odkazovat v jazyce XAML deklarací oboru názvů XAML pro knihovnu s deklarací oboru názvů určujícím název oboru názvů CLR (Common Language Runtime) a název sestavení:
<ContentPage ...
xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
...
</ContentPage>
Zadání oboru názvů CLR a názvu sestavení v xmlns
definici však může být nepříjemné a náchylné k chybám. Kromě toho může být vyžadováno více deklarací oboru názvů XAML, pokud knihovna obsahuje typy v několika oborech názvů.
Alternativním přístupem je definovat vlastní schéma oboru názvů, například http://mycompany.com/schemas/controls
, které se mapuje na jeden nebo více oborů názvů CLR. Díky tomu může jedna deklarace oboru názvů XAML odkazovat na všechny typy v sestavení, i když jsou v různých oborech názvů. Umožňuje také jednu deklaraci oboru názvů XAML odkazovat na typy v několika sestaveních.
Další informace o oborech názvů XAML naleznete v tématu Obory názvů XAML v Xamarin.Forms.
Definování vlastního schématu oboru názvů
Ukázková aplikace obsahuje knihovnu, která zveřejňuje některé jednoduché ovládací prvky, například CircleButton
:
using Xamarin.Forms;
namespace MyCompany.Controls
{
public class CircleButton : Button
{
...
}
}
Všechny ovládací prvky v knihovně se nacházejí v MyCompany.Controls
oboru názvů. Tyto ovládací prvky mohou být vystaveny volajícímu sestavení prostřednictvím vlastního schématu oboru názvů.
Vlastní schéma oboru názvů je definováno s XmlnsDefinitionAttribute
třídou, která určuje mapování mezi oborem názvů XAML a jedním nebo více obory názvů CLR. Přebírá XmlnsDefinitionAttribute
dva argumenty: název oboru názvů XAML a název oboru názvů CLR. Název oboru názvů XAML je uložen ve XmlnsDefinitionAttribute.XmlNamespace
vlastnosti a název oboru názvů CLR je uložen ve XmlnsDefinitionAttribute.ClrNamespace
vlastnosti.
Poznámka:
Třída XmlnsDefinitionAttribute
má také vlastnost s názvem AssemblyName
, která může být volitelně nastavena na název sestavení. To se vyžaduje pouze v případě, že je obor názvů CLR odkazovaný z externího XmlnsDefinitionAttribute
sestavení.
Měla by být definována XmlnsDefinitionAttribute
na úrovni sestavení v projektu, který obsahuje obory názvů CLR, které budou mapovány ve schématu vlastního oboru názvů. Následující příklad ukazuje soubor AssemblyInfo.cs z ukázkové aplikace:
using Xamarin.Forms;
using MyCompany.Controls;
[assembly: Preserve]
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]
Tento kód vytvoří vlastní schéma oboru názvů, které mapuje http://mycompany.com/schemas/controls
adresu URL na MyCompany.Controls
obor názvů CLR. Kromě toho Preserve
je atribut zadán v sestavení, aby se zajistilo, že linker zachová všechny typy v sestavení.
Důležité
Atribut Preserve
by se měl použít u tříd v sestavení, které jsou mapovány prostřednictvím vlastního schématu oboru názvů nebo použity na celé sestavení.
Vlastní schéma oboru názvů je pak možné použít k překladu typů v souborech XAML.
Využívání vlastního schématu oboru názvů
Aby bylo možné využívat typy z vlastního schématu oboru názvů, kompilátor XAML vyžaduje, aby byl v sestavení odkaz na kód, který využívá typy, do sestavení, které definuje typy. Toho lze dosáhnout přidáním třídy obsahující metodu Init
do sestavení, které definuje typy, které budou spotřebovány prostřednictvím XAML:
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
Metodu Init
pak lze volat ze sestavení, které využívá typy z vlastního schématu oboru názvů:
using Xamarin.Forms;
using MyCompany.Controls;
namespace CustomNamespaceSchemaDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Controls.Init();
InitializeComponent();
}
}
}
Upozorňující
Pokud takový odkaz na kód neobsahuje, kompilátor XAML nemůže najít sestavení obsahující vlastní typy schématu oboru názvů.
Chcete-li tento ovládací prvek využívat CircleButton
, je deklarován obor názvů XAML s deklarací oboru názvů určující adresu URL vlastního schématu oboru názvů:
<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
Instance je pak možné přidat do ContentPage
deklarací s předponou controls
oboru názvů.
Pokud chcete najít vlastní typy schématu oboru názvů, Xamarin.Forms vyhledá odkazovaná sestavení pro XmlnsDefinitionAttribute
instance. xmlns
Pokud atribut prvku v souboru XAML odpovídá XmlNamespace
hodnotě vlastnosti v objektu XmlnsDefinitionAttribute
, Xamarin.Forms pokusí se použít XmlnsDefinitionAttribute.ClrNamespace
hodnotu vlastnosti pro rozlišení typu. Pokud se překlad typu nezdaří, Xamarin.Forms bude se dál pokoušet o překlad typu na základě všech dalších odpovídajících XmlnsDefinitionAttribute
instancí.
Výsledkem je zobrazení dvou CircleButton
instancí: