Schémata vlastního oboru názvů XAML v Xamarin.Forms
Na typy v knihovně lze odkazovat v jazyce XAML deklarováním oboru názvů XAML pro knihovnu, s deklarací oboru názvů, který určuje název oboru názvů Common Language Runtime (CLR) 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 nevhodné 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 ve více oborech názvů.
Alternativním přístupem je definování schématu vlastního oboru názvů, například http://mycompany.com/schemas/controls , který je namapován na jeden nebo více oborů názvů CLR. To umožňuje jednu deklaraci oboru názvů XAML pro odkazování na všechny typy v sestavení, a to i v případě, že jsou v různých oborech názvů. Také umožňuje jednu deklaraci oboru názvů XAML pro odkazování na typy ve více sestaveních.
Další informace o oborech názvů XAML naleznete v tématu XAML Namespaces in Xamarin.Forms .
Definování schématu vlastního oboru názvů
Ukázková aplikace obsahuje knihovnu, která zpřístupň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ě jsou umístěny 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 XmlnsDefinitionAttribute třídou, která určuje mapování mezi oborem názvů XAML a jedním nebo více obory názvů CLR. XmlnsDefinitionAttributePřijímá 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
XmlnsDefinitionAttributeTřída obsahuje také vlastnost s názvem AssemblyName , která může být volitelně nastavena na název sestavení. To je nutné pouze v případě, že obor názvů CLR, na který odkazuje, XmlnsDefinitionAttribute je v externím sestavení.
XmlnsDefinitionAttributeMěla by být definována na úrovni sestavení v projektu, který obsahuje obory názvů CLR, které budou namapová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 bylo zajištěno, že linker zachovává všechny typy v sestavení.
Důležité
PreserveAtribut by měl být použit pro třídy v sestavení, které jsou namapovány prostřednictvím vlastního schématu oboru názvů nebo aplikovány na celé sestavení.
Vlastní schéma oboru názvů je pak možné použít pro rozlišení typu v souborech XAML.
Využívání vlastního schématu oboru názvů
Aby bylo možné využívat typy z schématu vlastního oboru názvů, kompilátor XAML vyžaduje, aby existoval odkaz na kód ze sestavení, které používá typy, na sestavení, které definuje typy. To lze provést přidáním třídy obsahující Init metodu do sestavení definující typy, které budou využity prostřednictvím jazyka XAML:
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
InitMetoda může být poté volána 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();
}
}
}
Upozornění
Nezahrnutí takového odkazu na kód způsobí, že kompilátor XAML nebude schopen najít sestavení obsahující typy schémat vlastního oboru názvů.
Pro využívání CircleButton ovládacího prvku je deklarován obor názvů XAML s deklarací oboru názvů, která určuje adresu URL schématu vlastního 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 lze následně přidat do rozhraní tím, že ContentPage je deklarujete pomocí controls předpony oboru názvů.
Chcete-li najít typy schémat vlastního oboru názvů, Xamarin.Forms budou vyhledávat odkazovaná sestavení pro XmlnsDefinitionAttribute instance. Pokud xmlns atribut prvku v souboru XAML odpovídá XmlNamespace hodnotě vlastnosti v XmlnsDefinitionAttribute , Xamarin.Forms se pokusí použít XmlnsDefinitionAttribute.ClrNamespace hodnotu vlastnosti pro rozlišení typu. Pokud se překlad typu nezdaří, Xamarin.Forms bude pokračovat v pokusu o překlad typu na základě jakýchkoli dalších vyhovujících XmlnsDefinitionAttribute instancí.
Výsledkem je, že CircleButton se zobrazí dvě instance:
Kolečka
Stažení ukázky