具有参数的Xamarin.Forms Shell导航层次结构

时间:2020-10-20 21:48:34

标签: xamarin.forms xamarin.forms.shell

如何在Xamarin.Forms Shell应用程序中定义以下导航层次结构?

  • “导航”选项卡(路线“主要”)
    • 带有订单列表的页面(路线“订单”)
      • 一个订单的详细信息页面(路线“订单”,参数“ orderId”)
        • 该特定订单(路线“ details1”,参数“ orderId”)的子明细页面1
        • 该特定订单(路线“ details2”,参数“ orderId”)的子明细页面2

只要只有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));

1 个答案:

答案 0 :(得分:1)

我对此有一种解决方法,您可以在 AppShell.xaml.cs RegisterRoute级别thirdfourth级别Route >。

如下:

Routing.RegisterRoute("Order", typeof(pages:OrderPage));
Routing.RegisterRoute("Details1", typeof(pages:OrderDetailPage1));

然后可以使用以下路线导航:

Shell.Current.GoToAsync("//main/orders/Order/Details1?orderId=5")

如果您使用.cs代码为每个页面注册了路由,那么它将起作用。通常,如果在Xaml中定义了第一级和第二级,则似乎不需要再次在代码中重新注册。因此,我只用名称键而不是路径键重新注册第三和Route