Introduzione ai renderer personalizzati

I renderer personalizzati offrono un approccio efficace per personalizzare l'aspetto e il comportamento dei Xamarin.Forms controlli. Possono essere usati per apportare piccole modifiche allo stile o per la personalizzazione di layout e comportamenti sofisticati specifici di una piattaforma. Questo articolo offre un'introduzione ai renderer personalizzati e illustra la procedura di creazione di un renderer personalizzato.

Xamarin.FormsPagine, layout e controlli presentano un'API comune per descrivere le interfacce utente per dispositivi mobili multipiattaforma. Ogni pagina, layout e controllo viene eseguito in modo diverso in ogni piattaforma, usando una Renderer classe che a sua volta crea un controllo nativo (corrispondente alla Xamarin.Forms rappresentazione), lo dispone sullo schermo e aggiunge il comportamento specificato nel codice condiviso.

Gli sviluppatori possono implementare le proprie classi Renderer per personalizzare l'aspetto e/o il comportamento di un controllo. I renderer personalizzati per un determinato tipo possono essere aggiunti al progetto di un'applicazione per personalizzare il controllo in un'unica posizione, consentendo il comportamento predefinito in altre piattaforme; in alternativa, è possibile aggiungere diversi renderer personalizzati a ogni progetto di applicazione per creare un aspetto diverso in iOS, Android e Universal Windows Platform (UWP). Tuttavia, l'implementazione di una classe di renderer personalizzata per eseguire una personalizzazione di controlli semplici è spesso una risposta complessa. Gli effetti semplificano questo processo e in genere vengono usati per apportare piccole modifiche allo stile. Per altre informazioni, vedere Effects (Effetti).

Perché i renderer personalizzati sono necessari

La modifica dell'aspetto di un Xamarin.Forms controllo, senza usare un renderer personalizzato, è un processo in due passaggi che comporta la creazione di un controllo personalizzato tramite la sottoclasse e quindi l'utilizzo del controllo personalizzato al posto del controllo originale. Il codice seguente illustra un esempio di creazione di sottoclassi del controllo Entry:

public class MyEntry : Entry
{
  public MyEntry ()
  {
    BackgroundColor = Color.Gray;
  }
}

Il controllo MyEntry è un controllo Entry dove BackgroundColor è impostato su grigio e vi si può fare riferimento in Xaml dichiarando uno spazio dei nomi per il percorso e usando il prefisso dello spazio dei nomi nell'elemento di controllo. Nell'esempio di codice riportato di seguito viene illustrato come il controllo personalizzato MyEntry può essere usato da un elemento ContentPage:

<ContentPage
    ...
    xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
    ...>
    ...
    <local:MyEntry Text="In Shared Code" />
    ...
</ContentPage>

Il prefisso dello spazio dei nomi local può essere qualsiasi elemento. I valori namespace e assembly devono tuttavia corrispondere ai dettagli del controllo personalizzato. Dopo aver dichiarato lo spazio dei nomi, il prefisso viene usato per fare riferimento al controllo personalizzato.

Nota

La definizione di xmlns è molto più semplice nei progetti di librerie .NET Standard che nei progetti condivisi. Una libreria .NET Standard è compilata in un assembly in modo che risulti semplice determinare quale debba essere il valore di assembly=CustomRenderer. Quando si usano i progetti condivisi, tutti gli asset condivisi (incluso lo XAML) vengono compilati in ognuno dei progetti di riferimento, il che significa che, se i progetti iOS, Android e UWP hanno i propri nomi degli assembly non è possibile scrivere la dichiarazione xmlns perché il valore deve essere diverso per ogni applicazione. I controlli personalizzati in XAML per i progetti condivisi richiedono che ogni progetto dell'applicazione venga configurato con lo stesso nome assembly.

Il controllo personalizzato MyEntry viene quindi sottoposto a rendering in ogni piattaforma, con uno sfondo grigio, come illustrato negli screenshot seguenti:

MyEntry Custom Control on each Platform

La modifica del colore di sfondo del controllo in ogni piattaforma è stata eseguita esclusivamente tramite la creazione di una sottoclasse del controllo. Questa tecnica consente tuttavia di ottenere risultati limitati, poiché non è possibile sfruttare i vantaggi di personalizzazioni e miglioramenti specifici della piattaforma. Quando sono obbligatori, è necessario implementare renderer personalizzati.

Creazione di una classe di renderer personalizzata

Di seguito è illustrato il processo di creazione di una classe di renderer personalizzata:

  1. Creare una sottoclasse della classe di renderer che esegue il rendering del controllo nativo.
  2. Eseguire l'override del metodo che esegue il rendering del controllo nativo e scrivere la logica per personalizzare il controllo. Spesso, il OnElementChanged metodo viene usato per eseguire il rendering del controllo nativo, che viene chiamato quando viene creato il controllo corrispondente Xamarin.Forms .
  3. Aggiungere un ExportRenderer attributo alla classe renderer personalizzata per specificare che verrà usato per eseguire il rendering del Xamarin.Forms controllo. Questo attributo viene usato per registrare il renderer personalizzato con Xamarin.Forms.

Nota

Per la maggior parte degli Xamarin.Forms elementi, è facoltativo fornire un renderer personalizzato in ogni progetto di piattaforma. Se un renderer personalizzato non è registrato, verrà usato il renderer predefinito per la classe di base del controllo. I renderer personalizzati sono tuttavia necessari in ogni progetto della piattaforma quando si esegue il rendering di un elemento View o ViewCell.

Gli argomenti di questa serie forniranno dimostrazioni e spiegazioni di questo processo per diversi Xamarin.Forms elementi.

Risoluzione dei problemi

Se un controllo personalizzato è contenuto in un progetto di libreria .NET Standard che è stato aggiunto alla soluzione (ad esempio, non la libreria .NET Standard creata dal modello di progetto Visual Studio per Mac/Visual Studio Xamarin.Forms App), è possibile che si verifichi un'eccezione in iOS quando si tenta di accedere al controllo personalizzato. Se si verifica questo problema, può essere risolto tramite la creazione di un riferimento al controllo personalizzato dalla classe AppDelegate:

var temp = new ClassInPCL(); // in AppDelegate, but temp not used anywhere

In tal modo il compilatore viene forzato al riconoscimento del tipo ClassInPCL risolvendolo. In alternativa, per ottenere lo stesso risultato è possibile aggiungere l'attributo Preserve alla classe AppDelegate:

[assembly: Preserve (typeof (ClassInPCL))]

Ciò consente di creare un riferimento al tipo ClassInPCL, che indica che è necessario in fase di esecuzione. Per altre informazioni, vedere Mantenimento del codice.

Riepilogo

Questo articolo ha offerto un'introduzione ai renderer personalizzati e illustrato la procedura di creazione di un renderer personalizzato. I renderer personalizzati offrono un approccio efficace per personalizzare l'aspetto e il comportamento dei Xamarin.Forms controlli. Possono essere usati per apportare piccole modifiche allo stile o per la personalizzazione di layout e comportamenti sofisticati specifici di una piattaforma.