如何更改 Shell 标签栏高度

How to change Shell Tabbar height

我的问题: 我将 Shell 与底部 Tabbar 一起使用,我只是想在 Android 和 iOS 上更改它的高度。

我的搜索结果: 我知道 Tabbar 是一个 Android/iOS 具有固定指定高度的内置功能。

似乎有一种方法可以使用“Custom-Renderer”来实现。我用这种方法找到的所有项目都不适用于我的 visual studio(>100 个错误或什么都不做)。

我很难相信我需要超过 100 行代码才能“仅”调整高度。有人可以提供一个可行的解决方案来更改 Shell 标签栏(底部标签)高度吗?

编辑

不幸的是,您需要在每个平台项目上创建自定义渲染器:

Android

MyShellRenderer class

[assembly: ExportRenderer(typeof(App.AppShell), typeof(App.Droid.MyShellRenderer))]

namespace App.Droid
{
    public class MyShellRenderer : ShellRenderer
    {
        public MyShellRenderer(Context context) : base(context)
        {
        }

    protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem)
        {
            return new MyBottomNavViewAppearanceTracker(this, shellItem);
        }
    }
}

MyBottomNavViewAppearanceTracker class

class MyBottomNavViewAppearanceTracker : ShellBottomNavViewAppearanceTracker
    {
        public MyBottomNavViewAppearanceTracker(IShellContext shellContext, ShellItem shellItem) : base(shellContext, shellItem)
        {
        }
        public override void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
        {
            bottomView.LayoutParameters.Height = 400;
            base.SetAppearance(bottomView, appearance);
        }
    }

编辑:

iOS 部分功劳归于 https://forums.xamarin.com/discussion/169894/how-to-change-shell-height-of-flyout-items-at-the-bottom-of-the-page

iOS

MyShellRenderer class

[assembly: ExportRenderer(typeof(App.AppShell), typeof(App.iOS.MyShellRenderer))]

namespace App.iOS
{
    public class MyShellRenderer : ShellRenderer
    {

        protected override IShellTabBarAppearanceTracker CreateTabBarAppearanceTracker()
        {
            return new MyCreateTabBarAppearanceTracker();
        }
    }
}

CreateTabBarAppearanceTracker class

class CreateTabBarAppearanceTracker : ShellTabBarAppearanceTracker
    {
    
        public override void SetAppearance(UITabBarController controller, ShellAppearance appearance)
        {
            UITabBar tabBar = controller.TabBar;
            int tabBarHeight = 100;

            if (tabBar.Frame.Height != tabBarHeight)
            {
                tabBar.Frame = new CGRect(tabBar.Frame.X, tabBar.Frame.Y + (tabBar.Frame.Height - tabBarHeight), tabBar.Frame.Width, tabBarHeight); 
            }
        }
    }

额外内容

您可能遗漏了一些可以解释异常大量错误的命名空间。

could not be found are you missing a using directive or an assembly reference

通常人们不会在答案中包含命名空间(using 语句),因为大多数时候命名空间是显而易见的,并且很容易被 visual studio 智能感知处理。

只需将光标放在或悬停在带红色下划线的语句上,就会出现一个小工具提示

然后单击“显示潜在修复”或键盘快捷键之一,select 适当的修复(通常是建议列表的第一个),在这种情况下,intelisense 将自动添加所需的命名空间。

我发现的每个代码示例都排除了 using 指令。就我而言,我需要以下 3 个我无法找到的。感谢@Cfun 的回答,上面的代码可以添加:

using Google.Android.Material.BottomNavigation;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;