Schémas d’espaces de noms personnalisés
Les types d’une bibliothèque d’interface utilisateur d’application multiplateforme .NET (.NET MAUI) peuvent être référencés en XAML en déclarant un espace de noms XML pour la bibliothèque, avec la déclaration d’espace de noms spécifiant le nom de l’espace de noms CLR (Common Language Runtime) et un nom d’assembly :
<ContentPage ...
xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
...
</ContentPage>
Toutefois, la spécification d’un espace de noms CLR et d’un nom d’assembly dans une xmlns
définition peut être maladroite et sujette à des erreurs. En outre, plusieurs déclarations d’espace de noms XML peuvent être requises si la bibliothèque contient des types dans plusieurs espaces de noms.
Une autre approche consiste à définir un schéma d’espace de noms personnalisé, tel que http://mycompany.com/schemas/controls
, qui est mappé à un ou plusieurs espaces de noms CLR. Cela permet à une seule déclaration d’espace de noms XML de référencer tous les types d’un assembly, même s’ils se trouvent dans différents espaces de noms. Il permet également à une seule déclaration d’espace de noms XML de référencer des types dans plusieurs assemblys.
Pour plus d’informations sur les espaces de noms XAML, consultez espaces de noms XAML.
Définir un schéma d’espace de noms personnalisé
Imaginez une bibliothèque qui expose certains contrôles simples, tels que CircleButton
:
namespace MyCompany.Controls
{
public class CircleButton : Button
{
...
}
}
Tous les contrôles de la bibliothèque résident dans l’espace MyCompany.Controls
de noms. Ces contrôles peuvent être exposés à un assembly appelant via un schéma d’espace de noms personnalisé.
Un schéma d’espace de noms personnalisé est défini avec la XmlnsDefinitionAttribute
classe, qui spécifie le mappage entre un espace de noms XAML et un ou plusieurs espaces de noms CLR. Il XmlnsDefinitionAttribute
prend deux arguments : le nom de l’espace de noms XAML et le nom de l’espace de noms CLR. Le nom de l’espace de noms XAML est stocké dans la XmlnsDefinitionAttribute.XmlNamespace
propriété et le nom de l’espace de noms CLR est stocké dans la XmlnsDefinitionAttribute.ClrNamespace
propriété.
Remarque
La XmlnsDefinitionAttribute
classe a également une propriété nommée AssemblyName
, qui peut éventuellement être définie sur le nom de l’assembly. Cela est obligatoire uniquement lorsqu’un espace de noms CLR référencé à partir d’un XmlnsDefinitionAttribute
est dans un assembly externe.
La XmlnsDefinitionAttribute
valeur doit être définie au niveau de l’assembly dans le projet qui contient les espaces de noms CLR qui seront mappés dans le schéma d’espace de noms personnalisé :
using MyCompany.Controls;
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]
Ce code crée un schéma d’espace de noms personnalisé qui mappe l’URL http://mycompany.com/schemas/controls
à l’espace MyCompany.Controls
de noms CLR.
Important
Vous devez indiquer à l’éditeur de liens de conserver les types dans l’assembly mappés via le schéma d’espace de noms personnalisé ou de conserver l’assembly entier. Pour plus d’informations, consultez Conserver le code.
Le schéma d’espace de noms personnalisé peut ensuite être utilisé pour la résolution de types dans les fichiers XAML.
Utiliser un schéma d’espace de noms personnalisé
Pour consommer des types à partir du schéma d’espace de noms personnalisé, le compilateur XAML requiert qu’il existe une référence de code de l’assembly qui consomme les types, à l’assembly qui définit les types. Pour ce faire, ajoutez une classe contenant une Init
méthode à l’assembly qui définit les types qui seront consommés via XAML :
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
La Init
méthode peut ensuite être appelée à partir de l’assembly qui consomme des types à partir du schéma d’espace de noms personnalisé :
using MyCompany.Controls;
namespace CustomNamespaceSchemaDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Controls.Init();
InitializeComponent();
}
}
}
Avertissement
Si vous ne parvenez pas à inclure une telle référence de code, le compilateur XAML ne peut pas localiser l’assembly contenant les types de schémas d’espace de noms personnalisés.
Pour consommer le CircleButton
contrôle, un espace de noms XAML est déclaré, avec la déclaration d’espace de noms spécifiant l’URL du schéma d’espace de noms personnalisé :
<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
les instances peuvent ensuite être ajoutées au ContentPage fichier en les déclarant avec le préfixe d’espace controls
de noms.
Pour rechercher les types de schémas d’espace de noms personnalisés, .NET MAUI recherche les assemblys référencés pour XmlnsDefinitionAttribute
les instances. Si l’attribut xmlns
d’un élément d’un fichier XAML correspond à la XmlNamespace
valeur de propriété dans un XmlnsDefinitionAttribute
fichier .NET MAUI tente d’utiliser la XmlnsDefinitionAttribute.ClrNamespace
valeur de propriété pour la résolution du type. En cas d’échec de la résolution de type, .NET MAUI continuera à tenter la résolution de type en fonction de toutes les instances correspondantes XmlnsDefinitionAttribute
supplémentaires.
Le résultat est que deux CircleButton
instances sont affichées :