Xamarin 如何在Shell选项卡栏选项卡中隐藏顶部导航选项卡

Xamarin 如何在Shell选项卡栏选项卡中隐藏顶部导航选项卡,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我花了很多精力在研究上,但我不能解决我的问题 我想要达到的目标: 我想使用Xamarin Shell导航并隐藏顶部导航选项卡(不是标题栏-->称为“导航栏”,不是“选项卡栏”)。注意图像和橙色标记的部分 Shell.TabBarIsVisible="False" hides Bottom "TabBar" ("Tab 1", "Tab 2", "Tab 3") Shell.NavBarIsVisible="False" hides Title Bar ("Page 1 Full Title")

我花了很多精力在研究上,但我不能解决我的问题

我想要达到的目标:

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

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>

我试过什么

  • 伊斯塔布斯托普

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

  • 将外壳内容放在TabBar之外。但后来我松开了我的标签

外壳图像:

更新:

这适用于Android但不适用于iOS(黑色页面):
在XAML中只有一个ShellContent,并在代码中手动添加其他内容
AppShell.mytab.Items.Add(shell1)
AppShell.mytab.Items.Remove(shell0)

当我在中间添加此行时:
Shell.Current.CurrentItem.Items[0]。CurrentItem=shell1;(项目[0]表示选项卡栏的第一个选项卡-->“选项卡1”)

看起来很管用,万岁!显示下一页,但会产生错误: System.NullReferenceException:“对象引用未设置为对象的实例” ShellSectionRootRenderer.cs:201

似乎

其他线程缺少可见选项

IsVisible已计划,但由于命名问题而被删除



更新2

今天从Xamarin更新/发布。表单4.5.0.657到4.6.0.726解决了这个问题。在iOS中,添加和删除都无法正常工作



Forms 4.6 Branch:18小时前的最新提交

您只能保留AppShell选项卡内的第一个contentpage

<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>
更新 如果要隐藏“后退”按钮,请将透明图像添加到项目中,并在xaml中进行设置

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

您只能在AppShell的选项卡中保留第一个contentpage

<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>
更新 如果要隐藏“后退”按钮,请将透明图像添加到项目中,并在xaml中进行设置

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

升级到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>
建造师

            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)

升级到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>
建造师

            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)

如果隐藏顶部选项卡,则如何在ShellContents之间切换(导航)?等待Shell.Current.GoToAsync(“///”+routeValue)@ColeXia MSFT通过该评论,您可以在页面之间切换。如果将ShellContent项移到选项卡栏之外,也可以使用此选项。但是在这些页面上没有选项卡栏,我知道你可以通过代码中的路由模式进入页面,但是你如何触发它呢?(没有按键)@ColeXia MSFT我有自己的“向导”(1-2-3-4),在那里我可以触发页面切换。在OnBackButton方法中。另外,我在页面上有几个“下一步”按钮,在那里我触发页面切换。我在AppShell.xaml.cs中为它构建了一个中央处理程序,在这里我做了一些验证。在Shell项目中不能隐藏顶部选项卡,而且我认为您不需要将四个页面扭曲到选项卡中(只保留第一个页面),您可以在代码中实例化它们,通过路由模式在它们之间切换。如果您隐藏顶部选项卡,如何切换(导航)在ShellContents之间?等待Shell.Current.GoToAsync(“///”+routeValue);@ColeXia MSFT使用该注释,您可以在页面之间切换。如果您将ShellContent项目移到选项卡栏之外,也可以这样做。但是这些页面上肯定没有选项卡栏。我知道您可以通过代码中的路由模式进入页面,但如何触发它?(不按tabs)@ColeXia MSFT我有自己的“向导”(1-2-3-4)在这里我触发页面切换。在OnBackButton方法中。我在页面本身上有几个“下一步”按钮,在这里我触发页面切换。我在AppShell.xaml.cs中为它构建了一个中央处理程序,在那里我进行一些验证。顶部选项卡不能隐藏在Shell项目中,我认为您不需要将四个页面扭曲到选项卡中(只保留第一页),您可以在代码隐藏中实例化它们,通过路由模式在它们之间切换。谢谢您,这很有效,只是我现在在标题栏中显示了一个“backitem”。如何防止这种情况?向后导航会生成一个“页面不能有父项”.Hi,非常感谢您提供的隐藏选项。我只需要找出整个导航堆栈,因为它在返回时失败。如果shell有一个shell.TopTabsVisible=False选项,我就可以很容易了…那么就不需要将shell导航与旧导航混合使用。我只是不明白为什么要从选项卡w添加/删除项目Works适用于android,但不适用于ios。这不是一个bug吗?也许我必须创建一个示例项目。但是今天清理将花费太长时间。我将在问题中发布该主题的另一个进展,因为它太长,无法发表评论。这是Xamarin.Forms中的一个bug。在今天的4.6版之后,我的代码适用于android和ios,没有任何代码更改。比非常感谢!如果问题解决了,你能发布你的解决方案并将其标记为答案吗?谢谢你,这很有效,只是我现在在标题栏中显示了一个“backitem”。如何防止这种情况发生?向后导航会生成一个“页面不能有父项”。嗨,非常感谢你提供了隐藏选项。我只需要找出是谁