Xamarin.Forms Shell 带参数的导航层次结构
Xamarin.Forms Shell Navigation Hierarchy with parameters
如何在 Xamarin.Forms Shell 应用程序中定义以下导航层次结构?
- 导航选项卡(路线“主要”)
- 带有订单列表的页面(路线“订单”)
- 一个订单的详情页面(路由“order”,参数“orderId”)
- 该特定订单的子详细信息页面 1(路线“details1”,参数“orderId”)
- 该特定订单的子详细信息页面 2(路线“details2”,参数“orderId”)
只要只有 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));
我有一个解决方法,您可以 RegisterRoute
third
和 fourth
级别 Route
再次在 AppShell.xaml.cs.
如下:
Routing.RegisterRoute("Order", typeof(OrderPage));
Routing.RegisterRoute("Details1", typeof(OrderDetailPage1));
然后可以使用follow route路径导航:
Shell.Current.GoToAsync("//main/orders/Order/Details1?orderId=5")
如果您在 .cs
代码中为每个页面注册路由,它将起作用。一般第一层和第二层定义在Xaml
中,似乎不需要再在代码中re-register。所以,我只re-register第三个和第四个Route
配了一个name-key,没有一个path-key。
如何在 Xamarin.Forms Shell 应用程序中定义以下导航层次结构?
- 导航选项卡(路线“主要”)
- 带有订单列表的页面(路线“订单”)
- 一个订单的详情页面(路由“order”,参数“orderId”)
- 该特定订单的子详细信息页面 1(路线“details1”,参数“orderId”)
- 该特定订单的子详细信息页面 2(路线“details2”,参数“orderId”)
- 一个订单的详情页面(路由“order”,参数“orderId”)
- 带有订单列表的页面(路线“订单”)
只要只有 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));
我有一个解决方法,您可以 RegisterRoute
third
和 fourth
级别 Route
再次在 AppShell.xaml.cs.
如下:
Routing.RegisterRoute("Order", typeof(OrderPage));
Routing.RegisterRoute("Details1", typeof(OrderDetailPage1));
然后可以使用follow route路径导航:
Shell.Current.GoToAsync("//main/orders/Order/Details1?orderId=5")
如果您在 .cs
代码中为每个页面注册路由,它将起作用。一般第一层和第二层定义在Xaml
中,似乎不需要再在代码中re-register。所以,我只re-register第三个和第四个Route
配了一个name-key,没有一个path-key。