Xamarin Shell 引发模糊路由匹配异常

Posted

技术标签:

【中文标题】Xamarin Shell 引发模糊路由匹配异常【英文标题】:Xamarin Shell Raise Ambiguous Routes matched Exception 【发布时间】:2019-10-12 09:53:59 【问题描述】:

在 Xamari.Forms 中,我在 AppShell.xaml 中使用以下路由声明:

 <FlyoutItem Title = "Toolbox"
             FlyoutDisplayOptions="AsMultipleItems"
             Route="Main">

      <ShellContent Title = "Toolbox"
                    ContentTemplate="DataTemplate Views:Toolbox"
                    Route="Toolbox"/>

 </FlyoutItem>

 <ShellContent Title = "Parameters"
               ContentTemplate="DataTemplate Views:Parameters"
               Route="Parameters"/>

AppShell.xaml.cs 中,我以编程方式为 Toolbox 页面添加了上下文页面导航:

public AppShell ()

    InitializeComponent ();

    Routing.RegisterRoute("Toolbox/TBOuvriers", typeof(TBOuvriers));

    BindingContext = this;

当我尝试从工具箱页面显示上下文页面导航时:await Shell.Current.GoToAsync("//Main/Toolbox/TBOuvriers");

我得到了这个异常:

System.ArgumentException:不明确的路线匹配://Main/Toolbox/TBOuvriers 找到匹配项: //主/工具箱/TBOuvriers/TBOuvriers, //Main/IMPL_Toolbox/Toolbox/TBOuvriers 参数名称:uri

就在调用之前,我可以看到 Shell 变量的值:Shell.Current.CurrentItem : "Title = Toolbox, Route = Main" Shell.Current.CurrentState.Location : "//Main/Toolbox"

这似乎是预期的。

如果我尝试使用此调用显示页面:await Shell.Current.GoToAsync("TBOuvriers"); 我也得到一个异常:System.Exception: Timeout exceeded getting exception details

那么,问题出在哪里? 这些路线来自哪里?!? 为什么工具箱页面被注册了2次?

欢迎所有想法!

最好的问候

【问题讨论】:

进一步查看网络上的文章,我发现人们主要将新页面(如上下文页面)声明为全局,但它们没有出现在 fyout 菜单中。如果我这样做,它对我有用。像在 xamarin shell 文档中一样将它们声明为现有页面的子页面(如在我的主题中)有问题吗? 同样的观察:在 Xanimals 演示项目中,他们使用 "Routing.RegisterRoute("monkeydetails", typeof(MonkeyDetailPage));" 而不是 "Routing.RegisterRoute("monkey/details", typeof(MonkeyDetailPage));" 为什么?调用 "await Shell.Current.GoToAsync("details") 应该更容易;" 来自每个动物页面,而不是 "await Shell.Current.GoToAsync($"state.Location/destinationRoute?name=animalName");"跨度> ,你可以在你的项目中尝试这种方式,这里有什么问题吗? 我做的和 XAnimals 一样。我所有的独立页面都在根目录中注册。但我无法成功应用他们在官方文档中提出的方式。所以,对我有用,但也许不是最好的方法。 如果你有更好的方法解决这个问题,请在这里分享,谢谢。 【参考方案1】:

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

System.ArgumentException: '不明确的路由匹配:...'

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

【讨论】:

以上是关于Xamarin Shell 引发模糊路由匹配异常的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms MonoTouchException:调用 Geolocator.GetPositionAsync 时引发 Objective-C 异常

hockeyapp 在 xamarin.forms 应用程序中的 UWP 上引发异常

应用启动时出错:Foundation.MonoTouchException:引发了 Objective-C 异常(Xamarin iOS)

Xamarin.Forms Shell 如何在路由导航中向字符串注入多个不同的值

异常'指纹不匹配'。启动 Android Xamarin.UITest 时

perl模糊匹配文件名