在 Xamarin Forms Shell 中向 GoToAsync URI 导航添加查询会导致它停止工作

Adding a query to GoToAsync URI Navigation in Xamarin Forms Shell causes it to stop working

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

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

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

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

这意味着您正在使用 Relative routes ,但是这不支持在 Xamarin Forms 4.7.

之前传递数据

如果使用4.7之前的Xamarin Forms版本,需要使用Absolute routes来传递数据,示例如下:

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

并且要接收数据,表示要导航到的页面的 class 或表示页面 BindingContext 的 class 必须用每个查询参数的 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 routes 现在也支持传递参数了。

我遇到了类似的问题,通过将页面注册到 AppShell.xaml.cs

解决了这个问题
Routing.RegisterRoute(nameof(MyPage),
                typeof(MyPage));