Xamarin.Forms Niestandardowe programy renderowania powłoki
Jedną z zalet aplikacji powłoki Xamarin.Forms jest to, że ich wygląd i zachowanie można w dużym stopniu dostosowywać za pomocą właściwości i metod udostępnianych przez różne klasy powłoki. Istnieje jednak również możliwość utworzenia niestandardowego modułu renderowania powłoki, gdy wymagane są bardziej rozbudowane dostosowania specyficzne dla platformy. Podobnie jak w przypadku innych niestandardowych modułów renderujących, niestandardowy moduł renderujący powłoki można dodać do tylko jednego projektu platformy w celu dostosowania wyglądu i zachowania, jednocześnie zezwalając na domyślne zachowanie na innej platformie; lub inny niestandardowy moduł renderowania powłoki można dodać do każdego projektu platformy w celu dostosowania wyglądu i zachowania zarówno w systemach iOS, jak i Android.
Aplikacje powłoki są renderowane przy użyciu ShellRenderer
klasy w systemach iOS i Android. W systemie iOS klasę ShellRenderer
można znaleźć w Xamarin.Forms.Platform.iOS
przestrzeni nazw. W systemie Android klasę ShellRenderer
można znaleźć w Xamarin.Forms.Platform.Android
przestrzeni nazw.
Proces tworzenia niestandardowego modułu renderowania powłoki jest następujący:
- Podklasa
Shell
klasy . Ta funkcja zostanie już wykonana w aplikacji powłoki. - Zużyj podklasę
Shell
klasy. Ta funkcja zostanie już wykonana w aplikacji powłoki. - Utwórz niestandardową klasę renderera, która pochodzi z
ShellRenderer
klasy na wymaganych platformach.
Tworzenie niestandardowej klasy modułu renderowania
Proces tworzenia niestandardowej klasy renderera powłoki jest następujący:
- Utwórz podklasę
ShellRenderer
klasy. - Zastąpij wymagane metody w celu wykonania wymaganego dostosowania.
- Dodaj element
ExportRendererAttribute
do podklasyShellRenderer
, aby określić, że będzie on używany do renderowania aplikacji powłoki. Ten atrybut służy do rejestrowania niestandardowego modułu renderowania za pomocą Xamarin.Formspolecenia .
Uwaga
Opcjonalne jest udostępnienie niestandardowego modułu renderowania powłoki w każdym projekcie platformy. Jeśli niestandardowy moduł renderowania nie jest zarejestrowany, zostanie użyta klasa domyślna ShellRenderer
.
Klasa ShellRenderer
uwidacznia następujące metody, które można zastąpić:
iOS | Android | Platforma 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 |
Klasy FlyoutItem
i TabBar
są aliasami dla ShellItem
klasy, a Tab
klasa jest aliasem dla ShellSection
klasy. CreateShellItemRenderer
W związku z tym metoda powinna zostać zastąpiona podczas tworzenia niestandardowego modułu renderowania dla FlyoutItem
obiektów, a CreateShellSectionRenderer
metoda powinna zostać zastąpiona podczas tworzenia niestandardowego modułu renderowania dla Tab
obiektów.
Ważne
Istnieją dodatkowe klasy modułu renderowania powłoki, takie jak ShellSectionRenderer
i ShellItemRenderer
, w systemach iOS, Android i UWP. Jednak te dodatkowe klasy renderera są tworzone przez przesłonięcia w ShellRenderer
klasie. W związku z tym dostosowanie zachowania tych dodatkowych klas renderujących można osiągnąć przez ich podklasę i utworzenie wystąpienia podklasy w odpowiedniej przesłonięci w podklasie ShellRenderer
.
Przykład systemu iOS
Poniższy przykład kodu przedstawia podklasę ShellRenderer
, dla systemu iOS, która ustawia obraz tła na pasku nawigacyjnym aplikacji 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;
}
}
}
Klasa MyShellRenderer
zastępuje metodę CreateShellSectionRenderer
i pobiera moduł renderowania utworzony przez klasę bazową. Następnie modyfikuje program renderujący, ustawiając obraz tła na pasku nawigacyjnym przed zwróceniem modułu renderowania.
Przykład systemu Android
Poniższy przykład kodu przedstawia podklasę ShellRenderer
dla systemu Android, która ustawia obraz tła na pasku nawigacyjnym aplikacji 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);
}
}
}
Klasa MyShellRenderer
zastępuje metodę CreateToolbarAppearanceTracker
i zwraca wystąpienie MyShellToolbarAppearanceTracker
klasy. Klasa MyShellToolbarAppearanceTracker
, która pochodzi z ShellToolbarAppearanceTracker
klasy, jest pokazana w poniższym przykładzie:
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);
}
}
}
Klasa MyShellToolbarAppearanceTracker
zastępuje metodę SetAppearance
i modyfikuje pasek narzędzi, ustawiając na nim obraz tła.
Ważne
Wystarczy dodać element ExportRendererAttribute
do niestandardowego modułu renderowania pochodzącego ShellRenderer
z klasy . Dodatkowe klasy modułu renderowania powłoki podrzędnej są tworzone przez klasę podrzędną ShellRenderer
.