Xamarin 如何在Shell选项卡栏选项卡中隐藏顶部导航选项卡
我花了很多精力在研究上,但我不能解决我的问题 我想要达到的目标: 我想使用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")
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之外。但后来我松开了我的标签
在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”。如何防止这种情况发生?向后导航会生成一个“页面不能有父项”。嗨,非常感谢你提供了隐藏选项。我只需要找出是谁