Xamarin.Forms Renderizadores personalizados do Shell
Uma das vantagens dos Xamarin.Forms aplicativos Shell é que sua aparência e comportamento são altamente personalizáveis por meio das propriedades e métodos que as várias classes do Shell expõem. No entanto, também é possível criar um renderizador personalizado do Shell quando personalizações específicas da plataforma mais extensas são necessárias. Assim como acontece com outros renderizadores personalizados, um renderizador personalizado do Shell pode ser adicionado a apenas um projeto de plataforma para personalizar a aparência e o comportamento, permitindo o comportamento padrão na outra plataforma; ou um renderizador personalizado do Shell diferente pode ser adicionado a cada projeto de plataforma para personalizar a aparência e o comportamento no iOS e no Android.
Os aplicativos do Shell são renderizados usando a classe ShellRenderer
no iOS e no Android. No iOS, a classe ShellRenderer
pode ser encontrada no namespace Xamarin.Forms.Platform.iOS
. No Android, a classe ShellRenderer
pode ser encontrada no namespace Xamarin.Forms.Platform.Android
.
O processo para criar um renderizador personalizado do Shell é o seguinte:
- Crie uma subclasse da classe
Shell
. Isso já será realizado no seu aplicativo do Shell. - Consuma a classe
Shell
com a subclasse. Isso já será realizado no seu aplicativo do Shell. - Crie uma classe de renderizador personalizado que derive da classe
ShellRenderer
nas plataformas necessárias.
Criar uma classe de renderizador personalizado
O processo para criar uma classe de renderizador personalizado é a seguinte:
- Crie uma subclasse da classe
ShellRenderer
. - Substitua os métodos necessários para realizar a personalização necessária.
- Adicione uma
ExportRendererAttribute
à subclasseShellRenderer
para especificar que ela será usada para renderizar o aplicativo do Shell. Esse atributo é usado para registrar o renderizador personalizado com Xamarin.Forms.
Observação
O fornecimento de um renderizador personalizado do Shell em cada projeto de plataforma é opcional. Se um renderizador personalizado não estiver registrado, então a classe ShellRenderer
será usada.
A classe ShellRenderer
expõe os seguintes métodos substituíveis:
iOS | Android | UWP |
---|---|---|
SetElementSize CreateFlyoutRenderer CreateNavBarAppearanceTracker CreatePageRendererTracker CreateShellFlyoutContentRenderer CreateShellItemRenderer CreateShellItemTransition CreateShellSearchResultsRenderer CreateShellSectionRenderer CreateTabBarAppearanceTracker Dispose OnCurrentItemChanged OnElementPropertyChanged OnElementSet UpdateBackgroundColor |
CreateFragmentForPage CreateShellFlyoutContentRenderer CreateShellFlyoutRenderer CreateShellItemRenderer CreateShellSectionRenderer CreateTrackerForToolbar CreateToolbarAppearanceTracker CreateTabLayoutAppearanceTracker CreateBottomNavViewAppearanceTracker OnElementPropertyChanged OnElementSet SwitchFragment Dispose |
CreateShellFlyoutTemplateSelector CreateShellHeaderRenderer CreateShellItemRenderer CreateShellSectionRenderer OnElementPropertyChanged OnElementSet UpdateFlyoutBackdropColor UpdateFlyoutBackgroundColor |
As classes FlyoutItem
e TabBar
são aliases da classe ShellItem
, e a classe Tab
é um alias da classe ShellSection
. Portanto, o método CreateShellItemRenderer
deve ser substituído ao criar um renderizador personalizado para objetos FlyoutItem
, e o método CreateShellSectionRenderer
deve ser substituído ao criar um renderizador personalizado para objetos Tab
.
Importante
Há classes de renderizador do Shell adicionais, como ShellSectionRenderer
e ShellItemRenderer
, no iOS, Android e UWP. No entanto, elas são criadas por substituições na classe ShellRenderer
. Portanto, a personalização do comportamento dessas classes de renderizador adicionais pode ser obtida por meio da criação de subclasses, e a criação de uma instância da subclasse na substituição apropriada na classe ShellRenderer
com subclasse.
Exemplo de iOS
O exemplo de código a seguir mostra uma ShellRenderer
com subclasse para iOS, que define uma imagem de plano de fundo na barra de navegação do aplicativo de Shell:
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(Xaminals.AppShell), typeof(Xaminals.iOS.MyShellRenderer))]
namespace Xaminals.iOS
{
public class MyShellRenderer : ShellRenderer
{
protected override IShellSectionRenderer CreateShellSectionRenderer(ShellSection shellSection)
{
var renderer = base.CreateShellSectionRenderer(shellSection);
if (renderer != null)
{
(renderer as ShellSectionRenderer).NavigationBar.SetBackgroundImage(UIImage.FromFile("monkey.png"), UIBarMetrics.Default);
}
return renderer;
}
}
}
A classe MyShellRenderer
substitui o método CreateShellSectionRenderer
e recupera o renderizador criado pela classe base. Ela, em seguida, modifica o renderizador ao definir uma imagem de plano de fundo na barra de navegação antes de retornar o renderizador.
Exemplo do Android
O exemplo de código a seguir mostra uma ShellRenderer
com subclasse para Android, que define uma imagem de plano de fundo na barra de navegação do aplicativo do Shell:
using Android.Content;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Xaminals.AppShell), typeof(Xaminals.Droid.MyShellRenderer))]
namespace Xaminals.Droid
{
public class MyShellRenderer : ShellRenderer
{
public MyShellRenderer(Context context) : base(context)
{
}
protected override IShellToolbarAppearanceTracker CreateToolbarAppearanceTracker()
{
return new MyShellToolbarAppearanceTracker(this);
}
}
}
A classe MyShellRenderer
substitui o método CreateToolbarAppearanceTracker
e retorna uma instância da classe MyShellToolbarAppearanceTracker
. A classe MyShellToolbarAppearanceTracker
, que deriva da classe ShellToolbarAppearanceTracker
, é mostrada no exemplo a seguir:
using AndroidX.AppCompat.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
namespace Xaminals.Droid
{
public class MyShellToolbarAppearanceTracker : ShellToolbarAppearanceTracker
{
public MyShellToolbarAppearanceTracker(IShellContext context) : base(context)
{
}
public override void SetAppearance(Toolbar toolbar, IShellToolbarTracker toolbarTracker, ShellAppearance appearance)
{
base.SetAppearance(toolbar, toolbarTracker, appearance);
toolbar.SetBackgroundResource(Resource.Drawable.monkey);
}
}
}
A classe MyShellToolbarAppearanceTracker
substitui o método SetAppearance
e modifica a barra de ferramentas ao definir uma imagem de plano de fundo nela.
Importante
Só é necessário adicionar ExportRendererAttribute
a um renderizador personalizado que derive da classe ShellRenderer
. As classes de renderizador do Shell com subclasse adicionais são criadas pela classe ShellRenderer
com subclasse.