我有一个非常简单的导航堆栈,由一个根页面组成,然后在它上面有一个模型页面。我的根页面被设置为根,因为它是第一个向 Shell 注册的页面。
public AppShell()
{
InitializeComponent();
// opening view
Regester<LoginPage>();
Regester<SignUpPage>();
...
}
private void Regester<T>()
{
System.Diagnostics.Debug.WriteLine($"Regestering with shell : {typeof(T).Name} - {typeof(T)}");
Items.Add(new ShellContent { Route = typeof(T).Name, ContentTemplate = new DataTemplate(typeof(T)) });
Routing.RegisterRoute(typeof(T).Name, typeof(T));
}
}
然后我使用相对路由导航到模型注册页面
Shell.Current.GoToAsync("SignUpPage");
或者我会使用绝对路由
Shell.Current.GoToAsync("///LogInPage/SignUpPage");
然后我将尝试使用
Shell.Current.GoToAsync("..");
但我得到这个例外
Global routes currently cannot be the only page on the stack, so absolute routing to global routes is not supported. For now, just navigate to: LoginPage/
在异常时,CurrentState.Location 属性是
Location = {///LoginPage/SignUpPage}
我不明白为什么会这样。如果我进一步进入堆栈并执行诸如尝试从详细信息页面导航回的内容,也会发生这种情况。我需要做什么才能使用 GoToAsync(".."(正确吗?
原因:
您的路径///LogInPage
无效。全局路由目前不能是导航堆栈上的唯一页面。因此,不支持到全局路由的绝对路由。
溶液:
还可以通过将有效的相对 URI 指定为 GoToAsync 方法的参数来执行导航。路由系统将尝试将 URI 与 ShellContent 对象匹配。因此,如果应用程序中的所有路由都是唯一的,则可以通过仅将唯一路由名称指定为相对 URI 来执行导航:
await Shell.Current.GoToAsync("SignUpPage");