我在研究上做了很多努力,但是我不能解决我的问题。
我想要实现的目标:
我想使用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小时前最新提交
答案 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)