Riepilogo del capitolo 27. Renderer personalizzati
Nota
Questo libro è stato pubblicato nella primavera del 2016, e non è stato aggiornato da allora. C'è molto nel libro che rimane prezioso, ma alcuni materiali sono obsoleti, e alcuni argomenti non sono più completamente corretti o completi.
Viene Xamarin.Forms eseguito il rendering di un elemento, Button
ad esempio, con un pulsante specifico della piattaforma incapsulato in una classe denominata ButtonRenderer
. Ecco la versione iOS di , la versione Android di ButtonRenderer
ButtonRenderer
e la versione UWP di .ButtonRenderer
Questo capitolo illustra come scrivere renderer personalizzati per creare visualizzazioni personalizzate mappate a oggetti specifici della piattaforma.
Gerarchia completa della classe
Esistono quattro assembly che contengono il codice specifico della Xamarin.Forms piattaforma. È possibile visualizzare l'origine in GitHub usando questi collegamenti:
- Xamarin.Forms. Piattaforma (molto piccola)
- Xamarin.Forms. Platform.iOS
- Xamarin.Forms. Platform.Android
- Xamarin.Forms. Platform.UAP
Nota
Gli WinRT
assembly menzionati nel libro non fanno più parte di questa soluzione.
Nell'esempio PlatformClassHierarchy viene visualizzata una gerarchia di classi per gli assembly validi per la piattaforma in esecuzione.
Si noterà una classe importante denominata ViewRenderer
. Questa è la classe da cui derivare durante la creazione di un renderer specifico della piattaforma. Esiste in tre versioni diverse, perché è legata al sistema di visualizzazione della piattaforma di destinazione:
IOS ViewRenderer<TView, TNativeView>
ha argomenti generici:
TView
vincolato aXamarin.Forms.View
TNativeView
vincolato aUIKit.UIView
Android ViewRenderer<TView, TNativeView>
ha argomenti generici:
TView
vincolato aXamarin.Forms.View
TNativeView
vincolato aAndroid.Views.View
La piattaforma UWP ViewRenderer<TElement, TNativeElement>
ha argomenti generici denominati in modo diverso:
TElement
vincolato aXamarin.Forms.View
TNativeElement
vincolato aWindows.UI.Xaml.FrameworkElement
Quando si scrive un renderer, si deriva una classe da View
e quindi si scrivono più ViewRenderer
classi, una per ogni piattaforma supportata. Ogni implementazione specifica della piattaforma fa riferimento a una classe nativa che deriva dal tipo specificato come TNativeView
parametro o TNativeElement
.
Ciao, renderer personalizzati!
Il programma HelloRenderers fa riferimento a una visualizzazione personalizzata denominata HelloView
nella relativa App
classe.
La HelloView
classe è inclusa nel progetto HelloRenderers e deriva semplicemente da View
.
La HelloViewRenderer
classe nel progetto HelloRenderers.iOS deriva da ViewRenderer<HelloView, UILabel>
. Nell'override OnElementChanged
crea un iOS UILabel
nativo e chiama SetNativeControl
.
La HelloViewRenderer
classe nel progetto HelloRenderers.Droid deriva da ViewRenderer<HelloView, TextView>
. Nell'override OnElementChanged
crea un android TextView
e chiama SetNativeControl
.
La HelloViewRenderer
classe in HelloRenderers.UWP e altri progetti Windows deriva da ViewRenderer<HelloView, TextBlock>
. Nell'override OnElementChanged
viene creato un oggetto Windows TextBlock
e viene chiamato SetNativeControl
.
Tutti i ViewRenderer
derivati contengono un ExportRenderer
attributo a livello di assembly che associa la HelloView
classe alla classe specifica HelloViewRenderer
. Questo è il modo in cui Xamarin.Forms individua i renderer nei singoli progetti di piattaforma:
Renderer e proprietà
Il set successivo di renderer implementa il disegno con puntini di sospensione e si trova nei vari progetti della Xamarin.Formssoluzione Book.Platform .
La EllipseView
classe si trova nella Xamarin.Formspiattaforma Book.Platform . La classe è simile a BoxView
e definisce solo una singola proprietà: Color
di tipo Color
.
I renderer possono trasferire i valori delle proprietà impostati su un View
oggetto nativo eseguendo l'override del OnElementPropertyChanged
metodo nel renderer. All'interno di questo metodo (e all'interno della maggior parte del renderer), sono disponibili due proprietà:
Element
, l'elemento Xamarin.FormsControl
, la visualizzazione nativa o l'oggetto widget o controllo
I tipi di queste proprietà sono determinati dai parametri generici in ViewRenderer
. In questo esempio, Element
è di tipo EllipseView
.
L'override OnElementPropertyChanged
può quindi trasferire il Color
valore dell'oggetto Element
all'oggetto nativo Control
, probabilmente con un certo tipo di conversione. I tre renderer sono:
- iOS:
EllipseViewRenderer
, che usa unaEllipseUIView
classe per l'ellisse. - Android:
EllipseViewRenderer
, che usa unaEllipseDrawableView
classe per l'ellisse. - UWP:
EllipseViewRenderer
, che può usare la classe nativa di WindowsEllipse
.
La classe EllipseDemo visualizza diversi di questi EllipseView
oggetti:
Il BouncingBall rimbalza sui EllipseView
lati dello schermo.
Renderer ed eventi
È anche possibile che i renderer generino indirettamente eventi. La StepSlider
classe è simile alla normale Xamarin.FormsSlider
, ma consente di specificare una serie di passaggi discreti tra i Minimum
valori e Maximum
.
I tre renderer sono:
- iOS:
StepSliderRenderer
- Android:
StepSliderRenderer
- UWP:
StepSliderRenderer
I renderer rilevano le modifiche apportate al controllo nativo e quindi chiamano SetValueFromRenderer
, che fa StepSlider
riferimento a una proprietà associabile definita in StepSlider
, una modifica a cui fa sì che venga generato un ValueChanged
evento.
L'esempio StepSliderDemo illustra questo nuovo dispositivo di scorrimento.