为什么 ShellNavBarAppearanceTracker 中的 SetAppearance 不是虚拟的,而 ShellTabBarAppearanceTracker 中的相同方法是虚拟的?

Why is SetAppearance in ShellNavBarAppearanceTracker not virtual while the same method in ShellTabBarAppearanceTracker is?

我已尝试为 iOS 中的自定义 Shell 渲染器的导航栏和标签栏创建自己的外观跟踪器。允许覆盖 TabBar 外观跟踪器的 SetAppearance 方法,但不允许覆盖 NavigationBar 外观跟踪器。这是为什么?

您可以看到ShellNavBarAppearanceTracker

的源代码
namespace Xamarin.Forms.Platform.iOS
{
  public class ShellNavBarAppearanceTracker : IShellNavBarAppearanceTracker, IDisposable
  {
    public ShellNavBarAppearanceTracker();

    public void Dispose();
    public void ResetAppearance(UINavigationController controller);
    public void SetAppearance(UINavigationController controller, ShellAppearance appearance);
    public virtual void SetHasShadow(UINavigationController controller, bool hasShadow);
    public void UpdateLayout(UINavigationController controller);
    protected virtual void Dispose(bool disposing);
  }
}

SetAppearance 方法是 public 而不是 virtual。所以你不能直接覆盖 SetAppearance

如果你想覆盖SetAppearance方法,你可以实现IShellNavBarAppearanceTracker

class MyNavBarAppearanceTracker : IShellNavBarAppearanceTracker
    {
        public void Dispose()
        {
        }

        public void ResetAppearance(UINavigationController controller)
        {
        }

        public void SetAppearance(UINavigationController controller, ShellAppearance appearance)
        {
        }

        public void SetHasShadow(UINavigationController controller, bool hasShadow)
        {
        }

        public void UpdateLayout(UINavigationController controller)
        {
        }
    }