共用方式為


Xamarin.Forms Shell 自定義轉譯器

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 自訂轉譯器的流程如下:

  1. Shell 類別子類別化。 此動作已經在您的 Shell 應用程式中完成。
  2. 取用子類別化的 Shell 類別。 此動作已經在您的 Shell 應用程式中完成。
  3. 在所需的平台上,建立衍生自 ShellRenderer 類別的自訂轉譯器類別。

建立自訂轉譯器類別

建立 Shell 自訂轉譯器類別的流程如下:

  1. 建立 ShellRenderer 類別的子類別。
  2. 覆寫必要的方法來執行必要的自訂。
  3. ExportRendererAttribute 加入至 ShellRenderer 子類別,以指出將使用它來轉譯 Shell 應用程式。 這個屬性是用來向 Xamarin.Forms註冊自定義轉譯器。

注意

您可以選擇在每個平台專案中提供 Shell 自訂轉譯器。 如果自訂轉譯器尚未註冊,則將使用預設的 ShellRenderer 類別。

ShellRenderer 類別會公開下列可覆寫的方法:

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

FlyoutItemTabBar 類別為 ShellItem 類別的別名,而 Tab 類別則為 ShellSection 類別的別名。 因此,在為 FlyoutItem 物件建立自訂轉譯器時,應該覆寫 CreateShellItemRenderer 方法,而在為 Tab 物件建立自訂轉譯器時應該覆寫 CreateShellSectionRenderer 方法。

重要

iOS、Android 和 UWP 上有其他 Shell 轉譯器類別,例如 ShellSectionRendererShellItemRenderer。 不過,這些其他轉譯器類別都會透過在 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 類別來建立。