Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 ButtonRenderere 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:
TViewrestrito aXamarin.Forms.ViewTNativeViewrestrito aUIKit.UIView
O Android ViewRenderer<TView, TNativeView> tem argumentos genéricos:
TViewrestrito aXamarin.Forms.ViewTNativeViewrestrito aAndroid.Views.View
A UWP ViewRenderer<TElement, TNativeElement> nomeou argumentos genéricos de forma diferente:
TElementrestrito aXamarin.Forms.ViewTNativeElementrestrito aWindows.UI.Xaml.FrameworkElement
Ao escrever um renderizador, você derivará uma classe de Viewe, 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 umaEllipseUIViewclasse para a elipse. - Android:
EllipseViewRenderer, que usa umaEllipseDrawableViewclasse 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.

