Criar um Xamarin.Forms renderizador visual
Xamarin.Forms O Visual permite que os renderizadores sejam criados e aplicados seletivamente a VisualElement
objetos, sem a necessidade de exibições de subclasse Xamarin.Forms . Um renderizador que especifica um IVisual
tipo, como parte de seu ExportRendererAttribute
, será usado para renderizar modos de exibição optados, em vez do renderizador padrão. No momento da seleção do renderizador, a Visual
propriedade da exibição é inspecionada e incluída no processo de seleção do renderizador.
Importante
Atualmente, a Visual
propriedade não pode ser alterada após a exibição ter sido renderizada, mas isso será alterado em uma versão futura.
O processo para criar e consumir um Xamarin.Forms renderizador Visual é:
- Crie renderizadores de plataforma para a exibição necessária. Para obter mais informações, consulte Criar renderizadores.
- Crie um tipo derivado de
IVisual
. Para obter mais informações, consulte Criar um tipo IVisual. - Registre o
IVisual
tipo como parte doExportRendererAttribute
que decora os renderizadores. Para obter mais informações, consulte Registrar o tipo IVisual. - Consuma o renderizador Visual definindo a
Visual
propriedade no modo de exibição como oIVisual
nome. Para obter mais informações, consulte Consumir o renderizador visual. - [opcional] Registre um nome para o
IVisual
tipo. Para obter mais informações, consulte Registrar um nome para o tipo IVisual.
Criar renderizadores de plataforma
Para obter informações sobre como criar uma classe de renderizador, consulte Renderizadores personalizados. No entanto, observe que um Xamarin.Forms renderizador Visual é aplicado a um modo de exibição sem precisar subclassificá-lo.
As classes de renderizador descritas aqui implementam um personalizado Button
que exibe seu texto com uma sombra.
iOS
O exemplo de código a seguir mostra o renderizador de botão para iOS:
public class CustomButtonRenderer : ButtonRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Cleanup
}
if (e.NewElement != null)
{
Control.TitleShadowOffset = new CoreGraphics.CGSize(1, 1);
Control.SetTitleShadowColor(Color.Black.ToUIColor(), UIKit.UIControlState.Normal);
}
}
}
Android
O exemplo de código a seguir mostra o renderizador de botão para Android:
public class CustomButtonRenderer : Xamarin.Forms.Platform.Android.AppCompat.ButtonRenderer
{
public CustomButtonRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Cleanup
}
if (e.NewElement != null)
{
Control.SetShadowLayer(5, 3, 3, Color.Black.ToAndroid());
}
}
}
Criar um tipo IVisual
Em sua biblioteca multiplataforma, crie um tipo derivado de IVisual
:
public class CustomVisual : IVisual
{
}
O CustomVisual
tipo pode então ser registrado nas classes do renderizador, permitindo que os objetos optem Button
por usar os renderizadores.
Registrar o tipo IVisual
Nos projetos de plataforma, adicione o no nível de ExportRendererAttribute
montagem:
[assembly: ExportRenderer(typeof(Xamarin.Forms.Button), typeof(CustomButtonRenderer), new[] { typeof(CustomVisual) })]
namespace VisualDemos.iOS
{
public class CustomButtonRenderer : ButtonRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
// ...
}
}
}
Neste exemplo para o projeto de plataforma iOS, o ExportRendererAttribute
especifica que a CustomButtonRenderer
classe será usada para renderizar objetos de consumo Button
, com o IVisual
tipo registrado como o terceiro argumento. Um renderizador que especifica um IVisual
tipo, como parte de seu ExportRendererAttribute
, será usado para renderizar modos de exibição optados, em vez do renderizador padrão.
Consumir o renderizador Visual
Um Button
objeto pode optar por usar as classes do renderizador definindo sua Visual
propriedade como Custom
:
<Button Visual="Custom"
Text="CUSTOM BUTTON"
BackgroundColor="{StaticResource PrimaryColor}"
TextColor="{StaticResource SecondaryTextColor}"
HorizontalOptions="FillAndExpand" />
Observação
Em XAML, um conversor de tipo elimina a necessidade de incluir o sufixo "Visual" no valor da Visual
propriedade. No entanto, o nome completo do tipo também pode ser especificado.
Este é o código C# equivalente:
Button button = new Button { Text = "CUSTOM BUTTON", ... };
button.Visual = new CustomVisual();
No momento da seleção do renderizador, a Visual
propriedade do é inspecionada e incluída no processo de seleção do Button
renderizador. Se um renderizador não for localizado, o Xamarin.Forms renderizador padrão será usado.
As capturas de tela a seguir mostram o renderizado Button
, que exibe seu texto com uma sombra:
Registrar um nome para o tipo IVisual
O VisualAttribute
pode ser usado para registrar opcionalmente um nome diferente para o IVisual
tipo. Essa abordagem pode ser usada para resolver conflitos de nomenclatura entre bibliotecas visuais diferentes ou em situações em que você deseja apenas fazer referência a um Visual por um nome diferente de seu nome de tipo.
O VisualAttribute
deve ser definido no nível de montagem na biblioteca multiplataforma ou no projeto de plataforma:
[assembly: Visual("MyVisual", typeof(CustomVisual))]
O IVisual
tipo pode então ser consumido através de seu nome registrado:
<Button Visual="MyVisual"
... />
Observação
Ao consumir um Visual através de seu nome registrado, qualquer sufixo "Visual" deve ser incluído.