Freigeben über


Benutzerdefinierte Namespaceschemas

Typen in einer .NET Multi-Platform App UI (.NET MAUI)-Bibliothek können in XAML referenziert werden, indem sie einen XML-Namespace für die Bibliothek deklarieren, wobei die Namespacedeklaration den Namespacenamen der Common Language Runtime (CLR) und einen Assemblynamen angibt:

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

Die Angabe eines CLR-Namespaces und eines Assemblynamens in einer xmlns Definition kann jedoch ungünstig und fehleranfällig sein. Darüber hinaus können mehrere XML-Namespacedeklarationen erforderlich sein, wenn die Bibliothek Typen in mehreren Namespaces enthält.

Ein alternativer Ansatz besteht darin, ein benutzerdefiniertes Namespaceschema zu definieren, z http://mycompany.com/schemas/controls. B. das einem oder mehreren CLR-Namespaces zugeordnet ist. Dadurch kann eine einzelne XML-Namespacedeklaration auf alle Typen in einer Assembly verweisen, auch wenn sie sich in verschiedenen Namespaces befinden. Außerdem ermöglicht sie eine einzelne XML-Namespacedeklaration, um auf Typen in mehreren Assemblys zu verweisen.

Weitere Informationen zu XAML-Namespaces finden Sie unter XAML-Namespaces.

Definieren eines benutzerdefinierten Namespaceschemas

Stellen Sie sich eine Bibliothek vor, die einige einfache Steuerelemente verfügbar macht, z CircleButton. B. :

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

Alle Steuerelemente in der Bibliothek befinden sich im MyCompany.Controls Namespace. Diese Steuerelemente können über ein benutzerdefiniertes Namespaceschema für eine aufrufende Assembly verfügbar gemacht werden.

Ein benutzerdefiniertes Namespaceschema wird mit der XmlnsDefinitionAttribute Klasse definiert, die die Zuordnung zwischen einem XAML-Namespace und einem oder mehreren CLR-Namespaces angibt. Es XmlnsDefinitionAttribute werden zwei Argumente verwendet: der XAML-Namespacename und der CLR-Namespacename. Der XAML-Namespacename wird in der XmlnsDefinitionAttribute.XmlNamespace Eigenschaft gespeichert, und der CLR-Namespacename wird in der XmlnsDefinitionAttribute.ClrNamespace Eigenschaft gespeichert.

Hinweis

Die XmlnsDefinitionAttribute Klasse verfügt auch über eine Eigenschaft namens AssemblyName, die optional auf den Namen der Assembly festgelegt werden kann. Dies ist nur erforderlich, wenn ein CLR-Namespace, auf den von einer XmlnsDefinitionAttribute externen Assembly verwiesen wird, vorhanden ist.

Dies XmlnsDefinitionAttribute sollte auf Assemblyebene im Projekt definiert werden, das die CLR-Namespaces enthält, die im benutzerdefinierten Namespaceschema zugeordnet werden:

using MyCompany.Controls;

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

Dieser Code erstellt ein benutzerdefiniertes Namespaceschema, das die http://mycompany.com/schemas/controls URL dem MyCompany.Controls CLR-Namespace zuordnet.

Wichtig

Sie sollten den Linker anweisen, Typen in der Assembly beizubehalten, die über das benutzerdefinierte Namespaceschema zugeordnet sind, oder die gesamte Assembly beizubehalten. Weitere Informationen finden Sie unter "Beibehalten von Code".

Das benutzerdefinierte Namespaceschema kann dann für die Typauflösung in XAML-Dateien verwendet werden.

Verwenden eines benutzerdefinierten Namespaceschemas

Um Typen aus dem benutzerdefinierten Namespaceschema zu nutzen, erfordert der XAML-Compiler, dass ein Codeverweis aus der Assembly vorhanden ist, die die Typen verwendet, auf die Assembly, die die Typen definiert. Dazu können Sie eine Klasse hinzufügen, die eine Init Methode zur Assembly enthält, die die Typen definiert, die über XAML verwendet werden:

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

Die Init Methode kann dann aus der Assembly aufgerufen werden, die Typen aus dem benutzerdefinierten Namespaceschema verwendet:

using MyCompany.Controls;

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

Warnung

Wenn ein solcher Codeverweis nicht eingeschlossen wird, kann der XAML-Compiler die Assembly nicht finden, die die benutzerdefinierten Namespaceschematypen enthält.

Um das CircleButton Steuerelement zu nutzen, wird ein XAML-Namespace deklariert, wobei die Namespacedeklaration die benutzerdefinierte Namespaceschema-URL angibt:

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

CircleButtonInstanzen können dann durch Deklarieren mit dem controls Namespacepräfix hinzugefügt ContentPage werden.

Um die benutzerdefinierten Namespaceschematypen zu finden, durchsucht .NET MAUI referenzierte Assemblys nach XmlnsDefinitionAttribute Instanzen. Wenn das xmlns Attribut für ein Element in einer XAML-Datei mit dem XmlNamespace Eigenschaftswert in einer XmlnsDefinitionAttribute.NET MAUI übereinstimmt, versucht .NET MAUI, den Eigenschaftswert für die XmlnsDefinitionAttribute.ClrNamespace Auflösung des Typs zu verwenden. Wenn die Typauflösung fehlschlägt, versucht .NET MAUI weiterhin die Typauflösung basierend auf allen zusätzlichen übereinstimmenden XmlnsDefinitionAttribute Instanzen.

Das Ergebnis ist, dass zwei CircleButton Instanzen angezeigt werden:

Screenshot of two circle buttons.