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í:

Tlačítka kruhu