Condividi tramite


Schemi spazio dei nomi personalizzati

È possibile fare riferimento ai tipi in una libreria DELL'interfaccia utente dell'app multipiattaforma .NET (.NET MAUI) in XAML dichiarando uno spazio dei nomi XML per la libreria, con la dichiarazione dello spazio dei nomi specificando il nome dello spazio dei nomi ClR (Common Language Runtime) e un nome di assembly:

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

Tuttavia, la specifica di uno spazio dei nomi CLR e di un nome di assembly in una xmlns definizione può essere imbarazzante e soggetta a errori. Inoltre, è possibile che siano necessarie più dichiarazioni di spazio dei nomi XML se la libreria contiene tipi in più spazi dei nomi.

Un approccio alternativo consiste nel definire uno schema dello spazio dei nomi personalizzato, ad esempio http://mycompany.com/schemas/controls, che esegue il mapping a uno o più spazi dei nomi CLR. Ciò consente a una singola dichiarazione dello spazio dei nomi XML di fare riferimento a tutti i tipi di un assembly, anche se si trovano in spazi dei nomi diversi. Consente inoltre a una singola dichiarazione dello spazio dei nomi XML di fare riferimento ai tipi in più assembly.

Per altre informazioni sugli spazi dei nomi XAML, vedi Spazi dei nomi XAML.

Definire uno schema dello spazio dei nomi personalizzato

Si supponga di creare una libreria che espone alcuni semplici controlli, ad esempio CircleButton:

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

Tutti i controlli nella libreria risiedono nello spazio dei MyCompany.Controls nomi . Questi controlli possono essere esposti a un assembly chiamante tramite uno schema dello spazio dei nomi personalizzato.

Uno schema dello spazio dei nomi personalizzato viene definito con la XmlnsDefinitionAttribute classe , che specifica il mapping tra uno spazio dei nomi XAML e uno o più spazi dei nomi CLR. Accetta XmlnsDefinitionAttribute due argomenti: il nome dello spazio dei nomi XAML e il nome dello spazio dei nomi CLR. Il nome dello spazio dei nomi XAML viene archiviato nella XmlnsDefinitionAttribute.XmlNamespace proprietà e il nome dello spazio dei nomi CLR viene archiviato nella XmlnsDefinitionAttribute.ClrNamespace proprietà .

Nota

La XmlnsDefinitionAttribute classe ha anche una proprietà denominata AssemblyName, che può essere facoltativamente impostata sul nome dell'assembly. Questa operazione è necessaria solo quando uno spazio dei nomi CLR a cui si fa riferimento da un XmlnsDefinitionAttribute oggetto si trova in un assembly esterno.

Deve XmlnsDefinitionAttribute essere definito a livello di assembly nel progetto che contiene gli spazi dei nomi CLR di cui verrà eseguito il mapping nello schema dello spazio dei nomi personalizzato:

using MyCompany.Controls;

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

Questo codice crea uno schema dello spazio dei nomi personalizzato che esegue il mapping dell'URL http://mycompany.com/schemas/controls allo spazio dei MyCompany.Controls nomi CLR.

Importante

È necessario indicare al linker di mantenere i tipi nell'assembly di cui è stato eseguito il mapping tramite lo schema dello spazio dei nomi personalizzato o mantenere l'intero assembly. Per altre informazioni, vedere Conservare il codice.

Lo schema dello spazio dei nomi personalizzato può quindi essere usato per la risoluzione dei tipi nei file XAML.

Utilizzare uno schema dello spazio dei nomi personalizzato

Per utilizzare i tipi dallo schema dello spazio dei nomi personalizzato, il compilatore XAML richiede che sia presente un riferimento di codice dall'assembly che utilizza i tipi, all'assembly che definisce i tipi. A tale scopo, è possibile aggiungere una classe contenente un Init metodo all'assembly che definisce i tipi che verranno utilizzati tramite XAML:

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

Il Init metodo può quindi essere chiamato dall'assembly che utilizza tipi dallo schema dello spazio dei nomi personalizzato:

using MyCompany.Controls;

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

Avviso

Se non si include un riferimento di codice di questo tipo, il compilatore XAML non sarà in grado di individuare l'assembly contenente i tipi di schema dello spazio dei nomi personalizzati.

Per utilizzare il CircleButton controllo, viene dichiarato uno spazio dei nomi XAML, con la dichiarazione dello spazio dei nomi che specifica l'URL dello schema dello spazio dei nomi personalizzato:

<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 Le istanze possono quindi essere aggiunte a ContentPage dichiarandole con il controls prefisso dello spazio dei nomi.

Per trovare i tipi di schema dello spazio dei nomi personalizzati, .NET MAUI cercherà gli assembly a cui si fa riferimento per XmlnsDefinitionAttribute le istanze. Se l'attributo xmlns per un elemento in un file XAML corrisponde al valore della XmlNamespace proprietà in un XmlnsDefinitionAttributeoggetto , .NET MAUI tenterà di usare il valore della XmlnsDefinitionAttribute.ClrNamespace proprietà per la risoluzione del tipo. Se la risoluzione dei tipi ha esito negativo, .NET MAUI continuerà a tentare la risoluzione dei tipi in base a eventuali istanze corrispondenti aggiuntive XmlnsDefinitionAttribute .

Il risultato è che vengono visualizzate due CircleButton istanze:

Screenshot of two circle buttons.