我正在使用带有选项卡栏和四个选项卡的 shell 导航。每个选项卡都包含一个内容页面。其中一些内容页面导航到其他(例如详细信息)页面,其中一些页面向下移动。导航工作正常,后退按钮返回堆栈。在一页上我添加了第四个级别并且它工作正常。在另一个选项卡上,我添加了第四个级别,但它的后退按钮始终没有任何作用。
为了方便调试,我修改了导航服务方法如下
private Task NavigateTo(string route)
{
var shell = Shell.Current;
var count = shell.Navigation.NavigationStack.Count;
foreach (Page page in shell.Navigation.NavigationStack)
{
if (page is not null)
{
Console.WriteLine(page.Title);
}
}
Console.WriteLine($"Navigating to page: {route}");
return Shell.Current.GoToAsync(route);
}
在第四层使用后退按钮时,路由为“..”,计数为 3,并且前两个页面列在控制台输出中 - 因此存在导航堆栈。
为什么“..”请求在没有引发错误/异常的情况下什么都不做?
解决方案
在 IOS 上运行,而不是在 MacCatalyst 上运行,出现了一个“System.ArgumentException: Ambiguous routes matched for”异常。通过进一步的研究和实验,问题是应用程序外壳页面上的重复/模棱两可的路由。
在 AppShell.xaml 中,我将以下内容作为选项卡栏定义的一部分:
<Tab Title="Journals">
<Tab.Icon>
<FontImageSource
FontFamily="MaterialIcons"
Glyph="{x:Static constants:MaterialIcon.Ledger}"
Size="Medium"/>
</Tab.Icon>
<ShellContent Route="JournalsView" ContentTemplate="{DataTemplate views:JournalsView}" />
</Tab>
然后在 AppShell.xaml.cs 中我也注册了“JournalsView”,如下所示:
Routing.RegisterRoute(nameof(JournalsView), typeof(JournalsView));
注释掉后者,并注册标签栏中定义的所有其他路由,修复了后退导航——即使这些页面没有直接涉及错误发生的地方。