Shell 應用程式的優點 Xamarin.Forms 之一是其外觀和行為可透過各種 Shell 類別公開的屬性和方法高度自定義。 不過,當需要更廣泛的平臺特定自定義時,也可以建立殼層自定義轉譯器。 如同其他自訂轉譯器,可以將 Shell 自訂轉譯器只加入至一個平台專案來自訂外觀和行為,同時在另一個平台上允許預設行為;或者,可將不同的 Shell 自訂轉譯器加入至每個平台專案,以自訂 iOS 和 Android 上的外觀與行為。
Shell 應用程式會在 iOS 和 Android 上使用 ShellRenderer 類別來轉譯。 在 iOS 上,ShellRenderer 類別可在下列 Xamarin.Forms.Platform.iOS 命名空間中找到。 在 Android 上,ShellRenderer 類別可在下列 Xamarin.Forms.Platform.Android 命名空間中找到。
建立 Shell 自訂轉譯器的流程如下:
- 將
Shell類別子類別化。 此動作已經在您的 Shell 應用程式中完成。 - 取用子類別化的
Shell類別。 此動作已經在您的 Shell 應用程式中完成。 - 在所需的平台上,建立衍生自
ShellRenderer類別的自訂轉譯器類別。
建立自訂轉譯器類別
建立 Shell 自訂轉譯器類別的流程如下:
- 建立
ShellRenderer類別的子類別。 - 覆寫必要的方法來執行必要的自訂。
- 將
ExportRendererAttribute加入至ShellRenderer子類別,以指出將使用它來轉譯 Shell 應用程式。 這個屬性是用來向 Xamarin.Forms註冊自定義轉譯器。
注意
您可以選擇在每個平台專案中提供 Shell 自訂轉譯器。 如果自訂轉譯器尚未註冊,則將使用預設的 ShellRenderer 類別。
ShellRenderer 類別會公開下列可覆寫的方法:
| iOS | Android | UWP |
|---|---|---|
SetElementSizeCreateFlyoutRendererCreateNavBarAppearanceTrackerCreatePageRendererTrackerCreateShellFlyoutContentRendererCreateShellItemRendererCreateShellItemTransitionCreateShellSearchResultsRendererCreateShellSectionRendererCreateTabBarAppearanceTrackerDisposeOnCurrentItemChangedOnElementPropertyChangedOnElementSetUpdateBackgroundColor |
CreateFragmentForPageCreateShellFlyoutContentRendererCreateShellFlyoutRendererCreateShellItemRendererCreateShellSectionRendererCreateTrackerForToolbarCreateToolbarAppearanceTrackerCreateTabLayoutAppearanceTrackerCreateBottomNavViewAppearanceTrackerOnElementPropertyChangedOnElementSetSwitchFragmentDispose |
CreateShellFlyoutTemplateSelectorCreateShellHeaderRendererCreateShellItemRendererCreateShellSectionRendererOnElementPropertyChangedOnElementSetUpdateFlyoutBackdropColorUpdateFlyoutBackgroundColor |
FlyoutItem 和 TabBar 類別為 ShellItem 類別的別名,而 Tab 類別則為 ShellSection 類別的別名。 因此,在為 FlyoutItem 物件建立自訂轉譯器時,應該覆寫 CreateShellItemRenderer 方法,而在為 Tab 物件建立自訂轉譯器時應該覆寫 CreateShellSectionRenderer 方法。
重要
iOS、Android 和 UWP 上有其他 Shell 轉譯器類別,例如 ShellSectionRenderer 和 ShellItemRenderer。 不過,這些其他轉譯器類別都會透過在 ShellRenderer 類別中覆寫來建立。 因此,自訂這些其他轉譯器類別的行為可藉由將它們子類別化,並在子類別化之 ShellRenderer 類別的適當覆寫中建立該子類別的執行個體來實現。
iOS 範例
下列程式碼範例會顯示適用於 iOS 且子類別化的 ShellRenderer,其會在 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;
}
}
}
MyShellRenderer 類別會覆寫 CreateShellSectionRenderer 方法,並擷取基底類別所建立的轉譯器。 它接著會在導覽列上設定背景影像,然後返回轉譯器,藉以修改轉譯器。
Android 範例
下列程式碼範例會顯示適用於 Android 且子類別化的 ShellRenderer,其會在 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);
}
}
}
MyShellRenderer 類別會覆寫 CreateToolbarAppearanceTracker 方法,並傳回 MyShellToolbarAppearanceTracker 類別的執行個體。 下列範例會顯示 MyShellToolbarAppearanceTracker 類別 (衍生自 ShellToolbarAppearanceTracker 類別):
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);
}
}
}
MyShellToolbarAppearanceTracker 類別會覆寫 SetAppearance 方法,並藉由在工具列上設定背景影像來修改它。
重要
僅需將 ExportRendererAttribute 加入至衍生自 ShellRenderer 類別的自訂轉譯器。 其他子類別化的 Shell 轉譯器類別都會由子類別化的 ShellRenderer 類別來建立。