在 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.7
,Relative routes 现在也支持传递参数了。
我遇到了类似的问题,通过将页面注册到 AppShell.xaml.cs
解决了这个问题
Routing.RegisterRoute(nameof(MyPage),
typeof(MyPage));
所以对于这个问题,我有一个非常简单的堆栈。主菜单屏幕 > 列表页面 > 详细信息页面。对于每个页面,我都使用
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.7
,Relative routes 现在也支持传递参数了。
我遇到了类似的问题,通过将页面注册到 AppShell.xaml.cs
Routing.RegisterRoute(nameof(MyPage),
typeof(MyPage));