Schemi dello spazio dei nomi personalizzati XAML in Xamarin.Forms
È 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 XmlnsDefinitionAttribute
oggetto , 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: