Partager via


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 XmlnsDefinitionAttributefichier .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 :

Screenshot of two circle buttons.