如何在Shell TabBar选项卡中隐藏“顶部导航”选项卡

时间:2020-04-29 08:38:33

标签: xamarin xamarin.forms

我在研究上做了很多努力,但是我不能解决我的问题。

我想要实现的目标:

我想使用Xamarin Shell导航并隐藏顶部导航选项卡(不是标题栏->称为“ navbar”,而不是“ tabbar”)。注意图像和橙色标记的部分。

Shell.TabBarIsVisible="False" hides Bottom "TabBar" ("Tab 1", "Tab 2", "Tab 3")
Shell.NavBarIsVisible="False" hides Title Bar ("Page 1 Full Title")

什么都没有隐藏标题栏下方的顶部导航标签



那是我的结构:

 <Shell>
    <TabBar x:Name="RootTab">
        <Tab 
            Title="Tab1" >
            <ShellContent 
                Route="page1" 
                Title="page1" 
                ContentTemplate="{DataTemplate view:Page1}" />
            <ShellContent 
                Route="page2" 
                Title="page2" 
                ContentTemplate="{DataTemplate view:Page2}" />
            <ShellContent 
                Route="page3" 
                Title="page3" 
                ContentTemplate="{DataTemplate view:Page3}" />
            <ShellContent 
                Route="page4" 
                Title="page4" 
                ContentTemplate="{DataTemplate view:Page4}" />
        </Tab>
        <Tab 
            Title="Tab2" >
            <ShellContent 
                Route="tab2" 
                Title="tab2" 
                ContentTemplate="{DataTemplate view:Tab2Page}" />
        </Tab>
        <Tab 
            Title="Tab3" >
            <ShellContent 
                Route="tab3" 
                Title="tab3" 
                ContentTemplate="{DataTemplate view:Tab3Page}" />
        </Tab>
    </TabBar>
  </Shell>

我尝试了什么?

  • IsTabStop

  • 只需在选项卡1中放置1个起始ShellContent(页面1),然后通过代码手动添加/删除页面(2、3、4)。对于Android来说效果很好。但是,iOS在添加新页面并从选项卡1删除旧页面后仅显示一个黑色页面。

  • 在TabBar外部放置ShellContents。但是后来我松开了TabBar ...

Shell图片:https://i.stack.imgur.com/WYugb.png

更新:

这在Android 中有效,但在iOS 中无效(黑页):
XAML中只有一个ShellContent,而在代码中手动添加了其他内容
AppShell.mytab.Items.Add(shell1);
AppShell.mytab.Items.Remove(shell0);

当我在中间添加此行时:
Shell.Current.CurrentItem.Items [0] .CurrentItem = shell1; (Items [0]表示TabBar的第一个标签->“制表符1”)

看起来不错,欢呼!并显示下一页,但会产生错误: System.NullReferenceException:'对象引用未设置为对象的实例' ShellSectionRootRenderer.cs:201

似乎像https://github.com/xamarin/Xamarin.Forms/issues/5428
https://github.com/xamarin/Xamarin.Forms/pull/10500

其他线程缺少IsVisible选项https://github.com/xamarin/Xamarin.Forms/issues/5232

IsVisible已计划,但由于命名问题而被删除 https://github.com/xamarin/Xamarin.Forms/pull/9023



更新2!

今天,从Xamarin.Forms 4.5.0.657到4.6.0.726的更新/发布解决了该问题。在iOS中添加和删除都无法正常工作!

https://github.com/xamarin/Xamarin.Forms/pull/10500
Xamarin.Forms 4.6分支:18小时前最新提交

2 个答案:

答案 0 :(得分:0)

您只能在AppShell的Tab中保留第一个内容页面。

<TabBar x:Name="RootTab">
    <Tab  Title="Tab1">
        <ShellContent 
            Route="page1" 
            Title="page1" 
            ContentTemplate="{DataTemplate view:Page1}" />
    </Tab>
    <Tab 
        Title="Tab2" >
        <ShellContent 
            Route="tab2" 
            Title="tab2" 
            ContentTemplate="{DataTemplate view:Tab2Page}" />
    </Tab>
    <Tab 
        Title="Tab3" >
        <ShellContent 
            Route="tab3" 
            Title="tab3" 
            ContentTemplate="{DataTemplate view:Tab3Page}" />
    </Tab>
</TabBar>

并使用旧方法在页面之间导航

// your "wizard"
await Navigation.PushAsync(new Page2());

更新

如果要隐藏后退按钮,请将透明图像添加到项目中,并设置为xaml

<Shell.BackButtonBehavior>
    <BackButtonBehavior IconOverride="transparent.png" IsEnabled="False"/>
</Shell.BackButtonBehavior>

答案 1 :(得分:0)

升级到Xamarin 4.6修复了该错误/问题。

这是我的代码/解决方案。

AppShell.xaml

<TabBar Route="tabBar">
        <Tab 
            x:Name="myTab" 
            Route="tab1"
            Icon="tab_icon1.png">
            <ShellContent 
                x:Name="shellStart"
                Route="route1A" 
                Title="title" 
                ContentTemplate="{DataTemplate view:Page1A}" />
        </Tab>
        <Tab 
            Route="tab2"
            Icon="tab_icon2.png">
            <ShellContent 
                Route="route2" 
                Title="title2" 
                ContentTemplate="{DataTemplate view:Page2}" />
        </Tab>
        </Tab>
        <Tab 
            Route="tab3"
            Icon="tab_icon3.png">
            <ShellContent 
                Route="route3" 
                Title="title3" 
                ContentTemplate="{DataTemplate view:Page3}" />
        </Tab>
    </TabBar>

AppShell.xaml.cs

public ShellContent shell0;
public ShellContent shell1;
public ShellContent shell2;
public ShellContent shell3;
public static Tab tabLocal;

构造函数

            tabLocal = myTab;
            shell0 = shellStart;
            shell1 = new ShellContent()
            {
                Content = new Page1B(),
                Title = "",
                Route = ""
            };
            shell2 = .... Page1C() ...
            shell3 = .... Page1D() ...
            ...

将页面0切换到1

AppShell.tabLocal.Items.Add(shell1);
AppShell.tabLocal.Items.Remove(shell0);

也许这两种用于导航的方法都很有用

protected async override void OnNavigating(ShellNavigatingEventArgs args)
protected override void OnNavigated(ShellNavigatedEventArgs args)