xamarin 当使用3个或更多页面时,GotoAsync内置后退按钮不会返回到上一页

xnifntxz  于 2023-02-01  发布在  Go
关注(0)|答案(2)|浏览(273)

在第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

**第1页:**我添加了//,因为我希望第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 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页开始,我开始堆叠页面,所以回去应该工作

pinkon5k

pinkon5k1#

或任何人将面临这个问题,并有这个错误消息了;

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

当您在XAML中注册路由(在appshell文件中),并且还尝试在C#的代码隐藏中注册路由时,会发生这种情况。仅使用XAML或C#注册路由一次,而不要同时使用两者。
在我的例子中,我注册了Page 2两次,我用c#删除了它,它对我很有效

vhmi4jdf

vhmi4jdf2#

用户15900757是对的,但答案不清楚......
我刚花了一天多的时间追踪这个如果我还有头发的话,现在就会全部拔掉。
遇到问题的页面是从真实的存在问题的页面向下导航的两个页面。
在应用程序 shell 导航中,您基本上会拥有顶级,它将被添加到MauiProgram.cs中,如下所示:

builder.services.AddSingleton<MyXAMLTopPage>();
builder.services.AddSingleton<MyXAMLSecondPage>();

(or我猜你也可以选择AddTransient)。
然后将其余页面也添加到此处。
然后在AppShell.xaml中,您将看到顶级菜单路径:

<ShellContent
Title="My Pages"
ContentTemplate="{DataTemplate local:MyXAMLTopPage}"
Route="MyXAMLTopPage"/>
...

对于子页面,它们将存在于AppShell.xaml.cs文件中,如下所示:

Routing.RegisterRoute(nameof(MyXAMLSecondPage), typeof(MyXAMLSecondPage));
....

除了AppShell.xaml文件外,我还在AppShell.xaml.cs文件中列出了顶级页面。这导致我在两个页面后出现路由问题。顶级页面没有在上面的错误消息中列出。
我希望这能帮助其他人;这是一个很难解决问题。

相关问题