有没有办法用Xamarin表单在Shell选项卡区域添加左右边距?

有没有办法用Xamarin表单在Shell选项卡区域添加左右边距?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,在平板电脑设备上以横向模式查看“我的页面”时,页面左右两侧都有边距: 是否有任何方法可以将左右边距添加到选项卡区域?您应该在iOS/Android平台上使用TabbedPageRenderer来更改选项卡栏模板。 例如,Android it可以是针对Android平台的TabLayout和针对iOS的TabBar 如果您指的是shell选项卡页面,那么您应该做的第一件事就是在平台上实现自己的ShellRenderer。之后,您需要重写CreateTabarAppearanceTracker方法

在平板电脑设备上以横向模式查看“我的页面”时,页面左右两侧都有边距:


是否有任何方法可以将左右边距添加到选项卡区域?

您应该在iOS/Android平台上使用TabbedPageRenderer来更改选项卡栏模板。 例如,Android it可以是针对Android平台的TabLayout和针对iOS的TabBar


如果您指的是shell选项卡页面,那么您应该做的第一件事就是在平台上实现自己的ShellRenderer。之后,您需要重写CreateTabarAppearanceTracker方法,在该方法中,您可以创建并返回自己的ShellTabBarAppearanceTracker(或适用于Android的ShellTabBarAppearanceTracker)。 之后,使用IShellTabBarAppearanceTracker(用于iOS)实现ShellTabBarAppearanceTracker。 你可以像这家伙那样做:
-在这里,更好的方法是使用填充而不是边距。过一会儿你就会明白为什么了

因此,从实现开始,您将需要利用

在这种特定情况下,我们需要从
ShellRenderer
继承。此外,Android和iOS之间也存在一些差异——对于Android,您需要覆盖
CreateBootNavViewAppearanceTracker
和iOS-
CreateTabarAppearanceTracker

假设您遵循了建议并将Shell命名为AppShell,那么这两个类将如下所示

Android:

使用Android.Content;
使用TestShellTabBarMargin;
使用TestShellTabBarMargin.Droid;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.Android;
[程序集:ExportRenderer(typeof(AppShell),typeof(AppShellRenderer))]
命名空间TestShellTabBarMargin.Droid
{
公共类AppShellRenderer:ShellRenderer
{
公共AppShellRenderer(上下文)
:基本(上下文)
{
}
受保护的覆盖IShellBottomNavViewAppearanceTracker CreateBoottomNavViewAppearanceTracker(ShellItem ShellItem)
{
返回新的marginedtabarappearance();
}
}
}
iOS:

使用TestShellTabBarMargin;
使用TestShellTabBarMargin.iOS;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.iOS;
[程序集:ExportRenderer(typeof(AppShell),typeof(AppShellRenderer))]
命名空间TestShellTabBarMargin.iOS
{
公共类AppShellRenderer:ShellRenderer
{
受保护的覆盖IShellTabBarAppearanceTracker CreateTabarAppearanceTracker()
{
返回新的marginedtabarappearance();
}
}
}
接下来,您需要创建外观类并从基类继承(Android-
ShellBottomNavViewAppearanceTracker
&iOS-
ShellTabBarAppearanceTracker

NB!:您也可以实现它们的接口(Android-
IShellBottomNavViewAppearanceTracker
&iOS-
IShellTabBarAppearanceTracker
),但这样一来,您将丢失所有已应用的样式,然后必须手动设置它们。

类被子类化后,重要的方法是
SetAppearance
ResetAppearance
也可以工作,但在许多其他情况下都会调用它,我们只需要更改一次

以下是它在Android上的默认外观:

正确的实现是如下设置底部导航视图的左右填充:

使用Android.Support.Design.Widget;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.Android;
命名空间TestShellTabBarMargin.Droid
{
公共类MarginedTabBarAppearance:ShellBottomNavViewAppearanceTracker
{
公共marginedtabarappearance(IShellContext shellContext,ShellItem ShellItem)
:base(shellContext,shellItem)
{
}
公共覆盖无效集合外观(BottomNavigationView bottomView、IShellAppearanceElement外观)
{
base.SetAppearance(底部视图,外观);
底部视图。设置填充(400,0,400,0);
}
}
}
最终结果:

如果要设置边距,而不是填充,则可以修改视图的layoutParams,如下所示:

public覆盖void SetAppearance(底部导航视图底部视图,外壳外观)
{
如果(bottomView.LayoutParameters为LinearLayout.LayoutParams LayoutParams)
{
layoutParams.SetMargins(400,0,400,0);
bottomView.LayoutParameters=layoutParams;
}
}
然而,在这里,它看起来是这样的: 您可以尝试设置父视图的背景色,但最终结果将是相同的,并且使用填充集,您不需要尝试修复未损坏的内容

对于iOS,基本流是相同的。重要的方法还是
SetAppearance
,在它里面我们可以修改我们的
uitabar

不幸的是,我还没有找到正确的配置,但我会在找到时更新我的答案。设置视图/帧的边距/偏移应该可以完成这项工作,但我怀疑Xamarin的人在执行该方法后正在重置这些值。我需要在这里进行一些修补和尝试

使用UIKit;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.iOS;
命名空间TestShellTabBarMargin.iOS
{
公共类MarginedTabBarAppearance:ShellTabBarAppearanceTracker
{
公共覆盖无效设置外观(UITabBarController控制器,外壳外观)
{
//修改选项卡栏设置
}
}
}
编辑:将项目的宽度和位置设置为居中也应该有效,事实上也有效,但仅适用于iPhone(纵向)。就像我说的,我怀疑Xamarin的人在我们的改变后做了一些更新

这个