Udostępnij za pośrednictwem


Niestandardowe schematy przestrzeni nazw XAML w programie Xamarin.Forms

Do typów w bibliotece można odwoływać się w języku XAML, deklarując przestrzeń nazw XAML dla biblioteki z deklaracją przestrzeni nazw określającą nazwę przestrzeni nazw środowiska uruchomieniowego języka wspólnego (CLR) i nazwę zestawu:

<ContentPage ...
             xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
    ...
</ContentPage>

Jednak określenie przestrzeni nazw CLR i nazwy zestawu w xmlns definicji może być niewygodne i podatne na błędy. Ponadto wiele deklaracji przestrzeni nazw XAML może być wymaganych, jeśli biblioteka zawiera typy w wielu przestrzeniach nazw.

Alternatywną metodą jest zdefiniowanie niestandardowego schematu przestrzeni nazw, takiego jak http://mycompany.com/schemas/controls, który jest mapowy na co najmniej jedną przestrzeń nazw CLR. Umożliwia to pojedynczej deklaracji przestrzeni nazw XAML odwołującej się do wszystkich typów w zestawie, nawet jeśli znajdują się w różnych przestrzeniach nazw. Umożliwia również pojedynczej deklaracji przestrzeni nazw XAML odwołania do typów w wielu zestawach.

Aby uzyskać więcej informacji na temat przestrzeni nazw XAML, zobacz Przestrzenie nazw XAML w pliku Xamarin.Forms.

Definiowanie niestandardowego schematu przestrzeni nazw

Przykładowa aplikacja zawiera bibliotekę, która uwidacznia niektóre proste kontrolki, takie jak CircleButton:

using Xamarin.Forms;

namespace MyCompany.Controls
{
    public class CircleButton : Button
    {
        ...
    }
}

Wszystkie kontrolki w bibliotece znajdują się w MyCompany.Controls przestrzeni nazw. Te kontrolki mogą być widoczne dla zestawu wywołującego za pomocą niestandardowego schematu przestrzeni nazw.

Niestandardowy schemat przestrzeni nazw jest definiowany z XmlnsDefinitionAttribute klasą, która określa mapowanie między przestrzenią nazw XAML i co najmniej jedną przestrzenią nazw CLR. Przyjmuje XmlnsDefinitionAttribute dwa argumenty: nazwę przestrzeni nazw XAML i nazwę przestrzeni nazw CLR. Nazwa przestrzeni nazw XAML jest przechowywana we XmlnsDefinitionAttribute.XmlNamespace właściwości, a nazwa przestrzeni nazw CLR jest przechowywana we XmlnsDefinitionAttribute.ClrNamespace właściwości .

Uwaga

Klasa XmlnsDefinitionAttribute ma również właściwość o nazwie AssemblyName, którą można opcjonalnie ustawić na nazwę zestawu. Jest to wymagane tylko wtedy, gdy przestrzeń nazw CLR, do których odwołuje się element , XmlnsDefinitionAttribute znajduje się w zestawie zewnętrznym.

Element XmlnsDefinitionAttribute powinien być zdefiniowany na poziomie zestawu w projekcie zawierającym przestrzenie nazw CLR, które zostaną zamapowane w niestandardowym schemacie przestrzeni nazw. W poniższym przykładzie pokazano plik AssemblyInfo.cs z przykładowej aplikacji:

using Xamarin.Forms;
using MyCompany.Controls;

[assembly: Preserve]
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]

Ten kod tworzy niestandardowy schemat przestrzeni nazw, który mapuje http://mycompany.com/schemas/controls adres URL na MyCompany.Controls przestrzeń nazw CLR. Ponadto atrybut Preserve jest określony w zestawie, aby upewnić się, że konsolidator zachowuje wszystkie typy w zestawie.

Ważne

Atrybut Preserve należy zastosować do klas w zestawie, które są mapowane za pomocą niestandardowego schematu przestrzeni nazw lub stosowane do całego zestawu.

Niestandardowy schemat przestrzeni nazw może być następnie używany do rozpoznawania typów w plikach XAML.

Korzystanie ze niestandardowego schematu przestrzeni nazw

Aby korzystać z typów ze schematu niestandardowej przestrzeni nazw, kompilator XAML wymaga odwołania do kodu z zestawu, który używa typów, do zestawu definiującego typy. Można to zrobić, dodając klasę zawierającą metodę Init do zestawu, która definiuje typy, które będą używane za pomocą języka XAML:

namespace MyCompany.Controls
{
    public static class Controls
    {
        public static void Init()
        {
        }
    }
}

Init Następnie można wywołać metodę z zestawu, który korzysta z typów ze schematu niestandardowej przestrzeni nazw:

using Xamarin.Forms;
using MyCompany.Controls;

namespace CustomNamespaceSchemaDemo
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            Controls.Init();
            InitializeComponent();
        }
    }
}

Ostrzeżenie

Brak dołączenia takiego odwołania do kodu spowoduje, że kompilator XAML nie może zlokalizować zestawu zawierającego niestandardowe typy schematów przestrzeni nazw.

Aby użyć kontrolki CircleButton , zadeklarowana jest przestrzeń nazw XAML z deklaracją przestrzeni nazw określającą niestandardowy adres URL schematu przestrzeni nazw:

<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 wystąpienia można następnie dodać do obiektu ContentPage , deklarując je przy użyciu prefiksu controls przestrzeni nazw.

Aby znaleźć niestandardowe typy schematów przestrzeni nazw, Xamarin.Forms wyszukaj odwołania do zestawów dla XmlnsDefinitionAttribute wystąpień. xmlns Jeśli atrybut elementu w pliku XAML pasuje XmlNamespace do wartości właściwości w XmlnsDefinitionAttributeobiekcie , Xamarin.Forms spróbuje użyć XmlnsDefinitionAttribute.ClrNamespace wartości właściwości do rozpoznawania typu. Jeśli rozpoznawanie typów nie powiedzie się, Xamarin.Forms będzie nadal podejmować próby rozpoznawania typów na podstawie dodatkowych pasujących XmlnsDefinitionAttribute wystąpień.

Wynikiem jest wyświetlenie dwóch CircleButton wystąpień:

Przyciski kółka