Xamarin.Forms Shell 自定义呈现器

Xamarin.Forms Shell 应用程序的优势之一是可通过各种 Shell 类公开的属性和方法对其外观和行为进行高度自定义。 但是,在需要更为广泛的特定于平台的自定义时,也可创建 Shell 自定义呈现器。 与其他自定义呈现器一样,可以将 Shell 自定义呈现器添加到一个平台项目以自定义外观和行为,同时允许其他平台上的默认行为;或者可将其他 Shell 自定义呈现器添加到各个平台项目以自定义 iOS 和 Android 上的外观和行为。

在 iOS 和 Android 上,使用 ShellRenderer 类呈现 Shell 应用程序。 在 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 类的实例。 以下示例说明了派生自 ShellToolbarAppearanceTracker 类的 MyShellToolbarAppearanceTracker 类:

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 类创建而成。