Resumo do Capítulo 27. Renderizadores personalizados
Observação
Este livro foi publicado na primavera de 2016 e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado e alguns tópicos não estão mais totalmente corretos ou completos.
Um Xamarin.Forms elemento como é Button
renderizado com um botão específico da plataforma encapsulado em uma classe chamada ButtonRenderer
. Aqui está a versão iOS do ButtonRenderer
, a versão Android do ButtonRenderer
e a versão UWP do ButtonRenderer
.
Este capítulo discute como você pode escrever seus próprios renderizadores para criar exibições personalizadas que mapeiam para objetos específicos da plataforma.
A hierarquia completa de classes
Há quatro assemblies que contêm o código específico da Xamarin.Forms plataforma. Você pode visualizar o código-fonte no GitHub usando estes links:
- Xamarin.Forms. Plataforma (muito pequena)
- Xamarin.Forms. Plataforma.iOS
- Xamarin.Forms. Plataforma.Android
- Xamarin.Forms. Plataforma.UAP
Observação
As WinRT
assembleias mencionadas no livro não fazem mais parte dessa solução.
O exemplo PlatformClassHierarchy exibe uma hierarquia de classe para os assemblies válidos para a plataforma em execução.
Você notará uma classe importante chamada ViewRenderer
. Essa é a classe da qual você deriva ao criar um renderizador específico da plataforma. Ele existe em três versões diferentes, porque está vinculado ao sistema de visualização da plataforma de destino:
O iOS ViewRenderer<TView, TNativeView>
tem argumentos genéricos:
TView
restrito aXamarin.Forms.View
TNativeView
restrito aUIKit.UIView
O Android ViewRenderer<TView, TNativeView>
tem argumentos genéricos:
TView
restrito aXamarin.Forms.View
TNativeView
restrito aAndroid.Views.View
A UWP ViewRenderer<TElement, TNativeElement>
nomeou argumentos genéricos de forma diferente:
TElement
restrito aXamarin.Forms.View
TNativeElement
restrito aWindows.UI.Xaml.FrameworkElement
Ao escrever um renderizador, você derivará uma classe de View
e, em seguida, escreverá várias ViewRenderer
classes, uma para cada plataforma compatível. Cada implementação específica da plataforma fará referência a uma classe nativa que deriva do tipo especificado como o TNativeView
parâmetro or TNativeElement
.
Olá, renderizadores personalizados!
O programa HelloRenderers faz referência a uma exibição personalizada nomeada HelloView
em sua App
classe.
A HelloView
classe está incluída no projeto HelloRenderers e simplesmente deriva de View
.
A HelloViewRenderer
classe no projeto HelloRenderers.iOS deriva de ViewRenderer<HelloView, UILabel>
. OnElementChanged
Na substituição, ele cria um iOS UILabel
nativo e chama SetNativeControl
.
A HelloViewRenderer
classe no projeto HelloRenderers.Droid deriva de ViewRenderer<HelloView, TextView>
. OnElementChanged
Na substituição, ele cria um Android TextView
e chama SetNativeControl
.
A HelloViewRenderer
classe no HelloRenderers.UWP e em outros projetos do Windows deriva de ViewRenderer<HelloView, TextBlock>
. OnElementChanged
Na substituição, ele cria um Windows TextBlock
e chama SetNativeControl
.
Todos os ViewRenderer
derivados contêm um ExportRenderer
atributo no nível do assembly que associa a HelloView
classe à classe específica HelloViewRenderer
. É assim que Xamarin.Forms localiza renderizadores nos projetos de plataforma individuais:
Renderizadores e propriedades
O próximo conjunto de renderizadores implementa o desenho de elipse e está localizado nos vários projetos da Xamarin.Formssolução Book.Platform .
A EllipseView
aula está na Xamarin.Formsplataforma Book.Platform . A classe é semelhante BoxView
e define apenas uma única propriedade: Color
do tipo Color
.
Os renderizadores podem transferir valores de propriedade definidos em a View
para o objeto nativo substituindo o OnElementPropertyChanged
método no renderizador. Dentro desse método (e na maior parte do renderizador), duas propriedades estão disponíveis:
Element
, o Xamarin.Forms elementoControl
, a visualização nativa ou widget ou objeto de controle
Os tipos dessas propriedades são determinados pelos parâmetros genéricos para ViewRenderer
. Neste exemplo, Element
é do tipo EllipseView
.
A OnElementPropertyChanged
substituição pode, portanto, transferir o Color
valor do Element
para o objeto nativo Control
, provavelmente com algum tipo de conversão. Os três renderizadores são:
- iOS:
EllipseViewRenderer
, que usa umaEllipseUIView
classe para a elipse. - Android:
EllipseViewRenderer
, que usa umaEllipseDrawableView
classe para a elipse. - UWP:
EllipseViewRenderer
, que pode usar a classe nativa do WindowsEllipse
.
A classe EllipseDemo exibe vários desses EllipseView
objetos:
O BouncingBall quica nas EllipseView
laterais da tela.
Renderizadores e eventos
Também é possível que os renderizadores gerem eventos indiretamente. A StepSlider
classe é semelhante à normal Xamarin.FormsSlider
, mas permite especificar uma série de etapas discretas entre os Minimum
valores e Maximum
.
Os três renderizadores são:
- iOS:
StepSliderRenderer
- Android:
StepSliderRenderer
- UWP:
StepSliderRenderer
Os renderizadores detectam alterações no controle nativo e, em seguida, chamam SetValueFromRenderer
, que faz referência a uma propriedade associável definida no StepSlider
, uma alteração que faz com que o StepSlider
dispare um ValueChanged
evento.
O exemplo StepSliderDemo demonstra esse novo controle deslizante.