Schemi dello spazio dei nomi personalizzati XAML in Xamarin.Forms

Download Sample Scaricare l'esempio

È possibile fare riferimento ai tipi in una libreria in XAML dichiarando uno spazio dei nomi XAML 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, potrebbero essere necessarie più dichiarazioni di spazio dei nomi XAML 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 XAML di fare riferimento a tutti i tipi in un assembly, anche se si trovano in spazi dei nomi diversi. Consente inoltre a una singola dichiarazione dello spazio dei nomi XAML di fare riferimento ai tipi in più assembly.

Per altre informazioni sugli spazi dei nomi XAML, vedere Spazi dei nomi XAML in Xamarin.Forms.

Definizione di uno schema dello spazio dei nomi personalizzato

L'applicazione di esempio contiene una libreria che espone alcuni controlli semplici, ad esempio CircleButton:

using Xamarin.Forms;

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. L'esempio seguente illustra il file AssemblyInfo.cs dall'applicazione di esempio:

using Xamarin.Forms;
using MyCompany.Controls;

[assembly: Preserve]
[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. Inoltre, l'attributo Preserve viene specificato nell'assembly per garantire che il linker mantenga tutti i tipi nell'assembly.

Importante

L'attributo Preserve deve essere applicato alle classi nell'assembly mappate tramite lo schema dello spazio dei nomi personalizzato o applicate all'intero assembly.

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

Utilizzo di 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 Xamarin.Forms;
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://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="http://mycompany.com/schemas/controls"
             x:Class="CustomNamespaceSchemaDemo.MainPage">
    <StackLayout Margin="20,35,20,20">
        ...
        <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, Xamarin.Forms 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 , Xamarin.Forms tenterà di usare il valore della proprietà per la XmlnsDefinitionAttribute.ClrNamespace risoluzione del tipo. Se la risoluzione dei tipi non riesce, Xamarin.Forms continuerà a tentare la risoluzione dei tipi in base a eventuali istanze corrispondenti aggiuntive XmlnsDefinitionAttribute .

Il risultato è che vengono visualizzate due CircleButton istanze:

Circle buttons