Пользовательские отрисовщики оболочки Xamarin.Forms

Одним из преимуществ приложений оболочки Xamarin.Forms является то, что их внешний вид и поведение подробно настраиваются через свойства и методы, которые предоставляются в классах оболочки. Но вы можете создать собственный отрисовщик оболочки, если доступных возможностей расширенной настройки для конкретной платформы недостаточно. Пользовательский отрисовщик оболочки, как и в других системах, можно добавить только в один проект платформы, чтобы настроить для нее внешний вид и поведение, сохраняя поведение по умолчанию для другой платформы. Вы также можете добавить разные пользовательские отрисовщики оболочки в каждый проект платформы, чтобы раздельно настраивать внешний вид и поведение для iOS и Android.

Приложения оболочки отображаются в iOS и Android через класс ShellRenderer. В iOS этот класс ShellRenderer находится в пространстве имен Xamarin.Forms.Platform.iOS. В Android класс ShellRenderer находится в пространстве имен Xamarin.Forms.Platform.Android.

Процесс создания пользовательского отрисовщика оболочки выглядит следующим образом.

  1. Создайте подкласс класса Shell. Обычно в приложении оболочки эта задача уже выполнена.
  2. Используйте подкласс класса Shell. Обычно в приложении оболочки эта задача уже выполнена.
  3. Создайте на нужной платформе класс пользовательского отрисовщика, наследуемый от класса ShellRenderer.

Создание класса пользовательского отрисовщика

Процесс создания класса пользовательского отрисовщика оболочки выглядит следующим образом.

  1. Создайте подкласс класса ShellRenderer.
  2. Переопределите методы для нужного изменения в поведении.
  3. Добавьте ExportRendererAttribute в подкласс ShellRenderer, чтобы указать, что он будет использоваться для отрисовки приложения оболочки. Этот атрибут используется для регистрации пользовательского отрисовщика в Xamarin.Forms.

Примечание.

Предоставлять пользовательский отрисовщик оболочки в проекте для каждой платформы необязательно. Если пользовательский отрисовщик незарегистрирован, используется класс 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

Классы FlyoutItem и TabBar являются псевдонимами для класса ShellItem, а класс Tab — для класса ShellSection. Таким образом, методы CreateShellItemRenderer и CreateShellSectionRenderer должны быть переопределены при создании пользовательского отрисовщика для объектов FlyoutItem и Tab соответственно.

Внимание

Для iOS, Android и UWP существуют дополнительные классы отрисовщика оболочки, такие как ShellSectionRenderer и ShellItemRenderer. Но эти дополнительные классы отрисовщика создаются путем переопределения класса ShellRenderer. Это означает, что любое поведение этих дополнительных классов отрисовщика можно переопределить, создавая для них подклассы и экземпляры этого подкласса в соответствующем переопределении производного класса ShellRenderer.

Пример для iOS

Следующий пример кода демонстрирует производный класс ShellRenderer для iOS, который задает фоновое изображение для панели навигации приложения оболочки:

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

Следующий пример кода демонстрирует производный класс ShellRenderer для Android, который задает фоновое изображение для панели навигации приложения оболочки:

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. Дополнительные производные классы отрисовщика оболочки создаются в подклассе класса ShellRenderer.