Schemi dello spazio dei nomi personalizzati XAML in Novell. FormsXAML Custom Namespace Schemas in Xamarin.Forms

Scaricare esempio Scaricare l'esempioDownload Sample Download the sample

È 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 che specifica il nome dello spazio dei nomi Common Language Runtime (CLR) e il nome di un assembly:Types in a library can be referenced in XAML by declaring a XAML namespace for the library, with the namespace declaration specifying the Common Language Runtime (CLR) namespace name and an assembly name:

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

Tuttavia, la specifica di uno spazio dei nomi CLR e xmlns di un nome di assembly in una definizione può essere imbarazzante e soggetta a errori.However, specifying a CLR namespace and assembly name in a xmlns definition can be awkward and error prone. Inoltre, potrebbero essere necessarie più dichiarazioni dello spazio dei nomi XAML se la libreria contiene tipi in più spazi dei nomi.In addition, multiple XAML namespace declarations may be required if the library contains types in multiple namespaces.

Un approccio alternativo consiste nel definire uno schema dello spazio dei nomi personalizzato http://mycompany.com/schemas/controls, ad esempio, che esegue il mapping a uno o più spazi dei nomi CLR.An alternative approach is to define a custom namespace schema, such as http://mycompany.com/schemas/controls, that maps to one or more CLR namespaces. 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.This enables a single XAML namespace declaration to reference all the types in an assembly, even if they are in different namespaces. Consente inoltre a una singola dichiarazione dello spazio dei nomi XAML di fare riferimento ai tipi in più assembly.It also enables a single XAML namespace declaration to reference types in multiple assemblies.

Per altre informazioni sugli spazi dei nomi XAML, vedere spazi dei nomi XAML in Novell. Forms.For more information about XAML namespaces, see XAML Namespaces in Xamarin.Forms.

Definizione di uno schema dello spazio dei nomi personalizzatoDefining a custom namespace schema

L'applicazione di esempio contiene una libreria che espone alcuni semplici controlli, ad CircleButtonesempio:The sample application contains a library that exposes some simple controls, such as CircleButton:

using Xamarin.Forms;

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

Tutti i controlli nella libreria si trovano nello MyCompany.Controls spazio dei nomi.All the controls in the library reside in the MyCompany.Controls namespace. Questi controlli possono essere esposti a un assembly chiamante tramite uno schema dello spazio dei nomi personalizzato.These controls can be exposed to a calling assembly through a custom namespace schema.

Uno schema dello spazio dei nomi personalizzato viene XmlnsDefinitionAttribute definito con la classe, che specifica il mapping tra uno spazio dei nomi XAML e uno o più spazi dei nomi CLR.A custom namespace schema is defined with the XmlnsDefinitionAttribute class, which specifies the mapping between a XAML namespace and one or more CLR namespaces. XmlnsDefinitionAttribute Accetta due argomenti: il nome dello spazio dei nomi XAML e il nome dello spazio dei nomi CLR.The XmlnsDefinitionAttribute takes two arguments: the XAML namespace name, and the CLR namespace name. Il nome dello spazio dei nomi XAML viene XmlnsDefinitionAttribute.XmlNamespace archiviato nella proprietà e il nome dello spazio dei nomi CLR XmlnsDefinitionAttribute.ClrNamespace viene archiviato nella proprietà.The XAML namespace name is stored in the XmlnsDefinitionAttribute.XmlNamespace property, and the CLR namespace name is stored in the XmlnsDefinitionAttribute.ClrNamespace property.

Nota

La XmlnsDefinitionAttribute classe dispone inoltre di una proprietà AssemblyNamedenominata, che può essere facoltativamente impostata sul nome dell'assembly.The XmlnsDefinitionAttribute class also has a property named AssemblyName, which can be optionally set to the name of the assembly. Questa operazione è necessaria solo quando uno spazio dei nomi CLR a XmlnsDefinitionAttribute cui viene fatto riferimento da un oggetto si trova in un assembly esterno.This is only required when a CLR namespace referenced from a XmlnsDefinitionAttribute is in a external assembly.

Il XmlnsDefinitionAttribute deve 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.The XmlnsDefinitionAttribute should be defined at the assembly level in the project that contains the CLR namespaces that will be mapped in the custom namespace schema. Nell'esempio seguente viene illustrato il file AssemblyInfo.cs dell'applicazione di esempio:The following example shows the AssemblyInfo.cs file from the sample application:

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 http://mycompany.com/schemas/controls che esegue il MyCompany.Controls mapping dell'URL allo spazio dei nomi CLR.This code creates a custom namespace schema that maps the http://mycompany.com/schemas/controls URL to the MyCompany.Controls CLR namespace. Inoltre, l' Preserve attributo viene specificato nell'assembly, per garantire che il linker manservi tutti i tipi nell'assembly.In addition, the Preserve attribute is specified on the assembly, to ensure that the linker preserves all the types in the assembly.

Importante

L' Preserve attributo deve essere applicato alle classi nell'assembly mappate tramite lo schema dello spazio dei nomi personalizzato o applicato all'intero assembly.The Preserve attribute should be applied to classes in the assembly that are mapped through the custom namespace schema, or applied to the entire assembly.

Lo schema dello spazio dei nomi personalizzato può quindi essere utilizzato per la risoluzione dei tipi nei file XAML.The custom namespace schema can then be used for type resolution in XAML files.

Utilizzo di uno schema dello spazio dei nomi personalizzatoConsuming a custom namespace schema

Per utilizzare i tipi dello schema dello spazio dei nomi personalizzato, il compilatore XAML richiede che esista un riferimento al codice dall'assembly che utilizza i tipi, all'assembly che definisce i tipi.To consume types from the custom namespace schema, the XAML compiler requires that there's a code reference from the assembly that consumes the types, to the assembly that defines the types. Questa operazione può essere eseguita aggiungendo una classe contenente un Init metodo all'assembly che definisce i tipi che verranno utilizzati tramite XAML:This can be accomplished by adding a class containing an Init method to the assembly that defines the types that will be consumed through XAML:

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

Il Init metodo può quindi essere chiamato dall'assembly che utilizza i tipi dello schema dello spazio dei nomi personalizzato:The Init method can then be called from the assembly that consumes types from the custom namespace schema:

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 a un codice di questo tipo, il compilatore XAML non è in grado di individuare l'assembly contenente i tipi di schema dello spazio dei nomi personalizzato.Failure to include such a code reference will result in the XAML compiler being unable to locate the assembly containing the custom namespace schema types.

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:To consume the CircleButton control, a XAML namespace is declared, with the namespace declaration specifying the custom namespace schema URL:

<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>

CircleButtonle istanze possono quindi essere aggiunte all' ContentPage oggetto dichiarando il controls prefisso dello spazio dei nomi.CircleButton instances can then be added to the ContentPage by declaring them with the controls namespace prefix.

Per trovare i tipi di schema dello spazio dei nomi personalizzato, Novell. Forms eseguirà la ricerca degli assembly di riferimento per XmlnsDefinitionAttribute le istanze.To find the custom namespace schema types, Xamarin.Forms will search referenced assemblies for XmlnsDefinitionAttribute instances. Se l' xmlns attributo per un elemento in un file XAML corrisponde al XmlNamespace valore della proprietà in XmlnsDefinitionAttributeun oggetto, Novell. Forms tenterà di XmlnsDefinitionAttribute.ClrNamespace usare il valore della proprietà per la risoluzione del tipo.If the xmlns attribute for an element in a XAML file matches the XmlNamespace property value in a XmlnsDefinitionAttribute, Xamarin.Forms will attempt to use the XmlnsDefinitionAttribute.ClrNamespace property value for resolution of the type. Se la risoluzione del tipo ha esito negativo, Novell. Forms continuerà a tentare la XmlnsDefinitionAttribute risoluzione del tipo in base a eventuali istanze corrispondenti aggiuntive.If type resolution fails, Xamarin.Forms will continue to attempt type resolution based on any additional matching XmlnsDefinitionAttribute instances.

Il risultato è che vengono CircleButton visualizzate due istanze:The result is that two CircleButton instances are displayed:

Pulsanti cerchioCircle buttons