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>
CircleButton
Instanzen 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: