如何在Xamarin.Forms Shell应用程序中定义以下导航层次结构?
- 导航选项卡(route"main"(
- 带有订单列表的页面(路由"订单"(
- 一个订单的详细页面(路由"订单",参数"订单Id"(
- 该特定订单的子详细信息页面1(路由"details1"、参数"orderId"(
- 该特定订单的子细节页2(路由"details2"、参数"orderId"(
- 一个订单的详细页面(路由"订单",参数"订单Id"(
- 带有订单列表的页面(路由"订单"(
只要只有order
页面而没有定义子详细信息页面,它就可以很好地工作。然后我可以通过Shell.Current.GoToAsync("//main/orders/order?orderId=5")
路线导航到该页面。
但是,当我添加子详细信息页面时(无论我是通过XAML还是Routing.RegisterRoute
执行此操作(,相同的GoToAsync
调用在System.ArgumentException: 'unable to figure out route for: //main/orders/order?orderId=5'
中失败
通过XAML的层次结构定义:
<Tab Title="My Orders" Route="main">
<ShellContent ContentTemplate="{DataTemplate pages:OrdersListPage}" Route="orders">
<ShellContent ContentTemplate="{DataTemplate pages:OrderPage}" Route="order">
<ShellContent ContentTemplate="{DataTemplate pages:OrderDetailPage1}" Route="details1" />
<ShellContent ContentTemplate="{DataTemplate pages:OrderDetailPage2}" Route="details2" />
</ShellContent>
</ShellContent>
</Tab>
当我通过自定义路线定义它时,也有同样的例外:
Routing.RegisterRoute("main/orders/order", typeof(pages:OrderPage));
Routing.RegisterRoute("main/orders/order/details1", typeof(pages:OrderDetailPage1));
Routing.RegisterRoute("main/orders/order/details1", typeof(pages:OrderDetailPage1));
我有一个解决方法,您可以在AppShell.xaml.cs.中再次为third
和fourth
级别的Route
设置RegisterRoute
如下:
Routing.RegisterRoute("Order", typeof(OrderPage));
Routing.RegisterRoute("Details1", typeof(OrderDetailPage1));
然后可以使用以下路径导航:
Shell.Current.GoToAsync("//main/orders/Order/Details1?orderId=5")
如果您在.cs
代码中为每个页面注册路由,它就会起作用。一般来说,如果在Xaml
中定义了第一级和第二级,则似乎不需要再次在代码中重新注册。因此,我只使用名称密钥而不是路径密钥来重新注册第三个和第四个Route
。