4

所以对于这个问题,我有一个非常简单的堆栈。主菜单屏幕 > 列表页面 > 详细信息页面。对于我正在使用的每个页面

Shell.Current.GoToAsync({name of page});

所以基本上是一个推送,然后回到堆栈中

Shell.Current.GoToAsync("../");

在我引入查询来传递数据之前,这一切都很好。

所以这很好用

Shell.Current.GoToAsync($"{nameof(Page)}");

但是这个

Shell.Current.GoToAsync($"{nameof(Page)}?Id={some id here}");

抛出此异常

Relative routing to shell elements is currently not supported. 
Try prefixing your uri with ///: ///PageName?Id=3AC71D0B-D8E3-6C18-FFE3-6D41E154F000

这是没有意义的,因为导航在不包含查询的情况下显然可以工作。我哪里错了?这是错误还是预期的行为?

4

2 回答 2

1

当前不支持到壳元素的相对路由。尝试在您的 uri 前面加上 ///: ///PageName?Id=3AC71D0B-D8E3-6C18-FFE3-6D41E154F000

这意味着您正在使用相对路由,但这不支持在 Xamarin Forms 之前传递数据4.7

如果使用之前的 Xamarin Forms 版本,则4.7需要使用绝对路由来传递数据,示例如下:

Shell.Current.GoToAsync($"//animals/elephants/elephantdetails?name={elephantName}");

为了接收数据,代表被导航到的页面的类,或页面的类BindingContext,必须用每个查询参数的 QueryPropertyAttribute 装饰:

[QueryProperty("Name", "name")]
public partial class ElephantDetailPage : ContentPage
{
    public string Name
    {
        set
        {
            BindingContext = ElephantData.Elephants.FirstOrDefault(m => m.Name == Uri.UnescapeDataString(value));
        }
    }
    ...
}

更多信息可以参考这里:https ://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/navigation#pass-data

==============================更新==================== ===========

正如 Shane 所说,从上面的 Xamarin Forms 版本开始4.7Relative 路由现在也支持传递参数。

于 2020-06-26T03:07:39.587 回答
0

我有一个类似的问题,并通过将页面注册到AppShell.xaml.cs

Routing.RegisterRoute(nameof(MyPage),
                typeof(MyPage));
于 2022-02-20T19:49:05.180 回答