【问题标题】:GotoAsync build in back button does not go back to previous page, when working with 3 or more pages使用 3 个或更多页面时,GotoAsync 内置后退按钮不会返回上一页
【发布时间】:2021-05-22 19:36:31
【问题描述】:

在第 3 页上,通过按内置返回按钮,它会返回到第 2 页。到目前为止一切顺利

但是,在第 4 页,通过按内置返回按钮,它不会返回到第 3 页。为什么不呢?

这里是日志:根据日志,问题在第 3 页

[0:] Shell: Failed to Navigate Back: 
System.ArgumentException: 
Ambiguous routes matched for: //D_FAULT_FlyoutItem7/IMPL_MyWalletPage/MyWalletPage/Page3 matches found: 
//D_FAULT_FlyoutItem7/IMPL_MyWalletPage/MyWalletPage/Page3,//D_FAULT_FlyoutItem7/IMPL_MyWalletPage/MyWalletPage/Page3
    Parameter name: uri
  at Xamarin.Forms.ShellUriHandler.GetNavigationRequest (Xamarin.Forms.Shell shell, System.Uri uri, System.Boolean enableRelativeShellRoutes, System.Boolean throwNavigationErrorAsException, Xamarin.Forms.ShellNavigationParameters shellNavigationParameters) [0x000aa] in D:\a\1\s\Xamarin.Forms.Core\Shell\ShellUriHandler.cs:207 
  at Xamarin.Forms.ShellNavigationManager.GoToAsync (Xamarin.Forms.ShellNavigationParameters shellNavigationParameters) [0x000b8] in D:\a\1\s\Xamarin.Forms.Core\Shell\ShellNavigationManager.cs:44 
  at Xamarin.Forms.ShellSection+NavigationImpl.OnPopAsync (System.Boolean animated) [0x000e9] in D:\a\1\s\Xamarin.Forms.Core\Shell\ShellSection.cs:1070 
  at Xamarin.Forms.Platform.Android.ShellToolbarTracker.OnNavigateBack () [0x0002a] in D:\a\1\s\Xamarin.Forms.Platform.Android\Renderers\ShellToolbarTracker.cs:207 

Page#1:我添加了//因为我想在Page#2 中添加ShellApp 内置菜单,而不是返回按钮

 async Task OnKeypadSubmitTapCommand()
{
     var route = $"//{ nameof(Page2)}";
     await Shell.Current.GoToAsync(route);
 }

第 2 页: Shell.Current.CurrentState.Location 这里是 \\Page2

 private async void Button_Clicked(object sender, EventArgs e)
    {
        var route = $"{ nameof(Page3)}";
        await Shell.Current.GoToAsync(route);
    }

第 3 页: Shell.Current.CurrentState.Location 这里是 \\Page2

 private async void Button_Clicked(object sender, EventArgs e)
    {
        var route = $"{ nameof(Page4)}";
        await Shell.Current.GoToAsync(route);
    }

第 4 页: Shell.Current.CurrentState.Location 这里是 \\Page2\Page3

 private async void Button_Clicked(object sender, EventArgs e)
    {
        ...
    }

注册路线

Routing.RegisterRoute(nameof(Page0), typeof(Page0));
Routing.RegisterRoute(nameof(Page1), typeof(Page1));
Routing.RegisterRoute(nameof(Page2), typeof(Page2));
Routing.RegisterRoute(nameof(Page3), typeof(Page3));
Routing.RegisterRoute(nameof(Page4), typeof(Page4));

FlyoutItem

<FlyoutItem Title="Splash Screen" Icon="icon_about.png" FlyoutItemIsVisible="false">
    <ShellContent Route="Page0" ContentTemplate="{DataTemplate local:Page0}" />
</FlyoutItem>
<FlyoutItem Title="HomePage" Icon="icon_about.png">
    <ShellContent Route="Page2" ContentTemplate="{DataTemplate local:Page2}" />
</FlyoutItem>

文件夹

>Folder1
  >Page#1
>Folder2 
   >Page#3
   >Page#4
>Page#2

我在谷歌上查看但没有解决方案。我知道 GoToAsync 的工作原理是将页面堆叠在顶部并弹出它。在我上面的代码中,从第 2 页开始,我开始堆叠页面,所以回去应该可以工作

【问题讨论】:

  • “GoToAsync 的工作原理是将页面堆叠在顶部并弹出它” - 在旧式导航中总是如此。但是当使用Routing 时,它(有时)是不同的。 docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/… 中的关键语句是“当从 Shell 视觉层次结构导航到路由时,不会创建导航堆栈。”。我自己没有使用过路由;不确定是否有一个很好的教程可以准确地展示什么时候会发生什么。

标签: c# android xamarin xamarin.forms xamarin.android


【解决方案1】:

或任何将面临此问题并且也有此错误消息的人;

 System.ArgumentException: 'Ambiguous routes matched for: ...'

当您在 XAML 中(在 appshell 文件中)注册您的路由并且您还尝试在 C# 中的代码中注册您的路由时,会发生这种情况。仅使用 XAML 或 C# 注册一次您的路由,而不是同时使用两者。

就我而言,我让 Page2 注册了两次。我在 c# 中删除了它,它对我有用

【讨论】:

  • 天哪,这就是问题所在!我在 XAML 和 CS 中注册了页面,这导致了奇怪的行为。非常感谢您分享您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2012-04-18
  • 2017-10-07
  • 2020-09-24
  • 1970-01-01
  • 2021-08-28
相关资源
最近更新 更多