Xamarin 导航有替代方案吗?
Is it there an alternative to Navigation for Xamarin?
我正在使用 Xamarin.Forms 开发 Android 应用程序。我在导航方面遇到了一些问题。
当我使用 Navigation.PushAsync(new ContentPage());
时,我的导航流程会创建按钮。当我按下返回键时,我会重新访问本应无法访问的页面。例如我推送这个页面:
登录(去)> 菜单(去)> CloseSession(去)> 登录
当我点击Android的返回按钮时,流程是这样的:
登录(go)>菜单(go)>CloseSession(go)>登录(goback)>CloseSession(goback)>菜单(goback)>登录
退出应用程序:
登录(go)> 菜单(go)> CloseSession(go)> 登录(goback)> App close
我知道如果我使用 Navigation.PopAsync();
最后一个推送页面会从导航堆栈中删除,但它对我来说看起来很棘手。 Xamarin 导航有替代方案吗?一些创建导航页面避免将它们添加到堆栈中的方法?
你不应该这样使用导航。一些表单(尤其是登录)应该在完成时弹出。
- 推送登录表单
- 用户完成登录
- 弹出登录表单
- 决定接下来应该推送哪个表单。
在您的场景中,我建议您使用 Modal Pages 来显示登录页面。
它将创建一个额外的模态堆栈,这不会影响原始堆栈。
当用户完成登录后,弹出登录页面。
流量
- 将
NavigationPage(root page : Main)
设置为 App 中的主页面
- 使用
PushModalAsync
显示登录页面。
- 完成登录
- 使用
PopModalAsync
关闭登录页面。
我相信您正在尝试做的是“操纵导航堆栈”。
如果您不希望某个页面出现在导航堆栈中,您可以在使用 Navigation.RemovePage(page)
离开它时立即将其删除。
您可以传递该页面的已保存引用,或在 Navigation.NavigationStack
中查找它,如果这是已知情况(您要删除的页面的已知导航堆栈索引),您可以执行以下操作:
Navigation.RemovePage(Navigation.NavigationStack[索引]);
或者您可以使用 InsertPageBefore()
后跟 PopAsync()
,如 navigation docs 示例所示:
These methods enable a custom navigation experience, such as replacing a login page with a new page, following a successful login. The following code example demonstrates this scenario:
async void OnLoginButtonClicked(object sender, EventArgs e)
{
if (IsValid)
{
Navigation.InsertPageBefore(new MainPage (), this);
await Navigation.PopAsync();
}
else
{
// Login failed
}
}
我正在使用 Xamarin.Forms 开发 Android 应用程序。我在导航方面遇到了一些问题。
当我使用 Navigation.PushAsync(new ContentPage());
时,我的导航流程会创建按钮。当我按下返回键时,我会重新访问本应无法访问的页面。例如我推送这个页面:
登录(去)> 菜单(去)> CloseSession(去)> 登录
当我点击Android的返回按钮时,流程是这样的:
登录(go)>菜单(go)>CloseSession(go)>登录(goback)>CloseSession(goback)>菜单(goback)>登录
退出应用程序:
登录(go)> 菜单(go)> CloseSession(go)> 登录(goback)> App close
我知道如果我使用 Navigation.PopAsync();
最后一个推送页面会从导航堆栈中删除,但它对我来说看起来很棘手。 Xamarin 导航有替代方案吗?一些创建导航页面避免将它们添加到堆栈中的方法?
你不应该这样使用导航。一些表单(尤其是登录)应该在完成时弹出。
- 推送登录表单
- 用户完成登录
- 弹出登录表单
- 决定接下来应该推送哪个表单。
在您的场景中,我建议您使用 Modal Pages 来显示登录页面。
它将创建一个额外的模态堆栈,这不会影响原始堆栈。
当用户完成登录后,弹出登录页面。
流量
- 将
NavigationPage(root page : Main)
设置为 App 中的主页面 - 使用
PushModalAsync
显示登录页面。 - 完成登录
- 使用
PopModalAsync
关闭登录页面。
我相信您正在尝试做的是“操纵导航堆栈”。
如果您不希望某个页面出现在导航堆栈中,您可以在使用
Navigation.RemovePage(page)
离开它时立即将其删除。 您可以传递该页面的已保存引用,或在Navigation.NavigationStack
中查找它,如果这是已知情况(您要删除的页面的已知导航堆栈索引),您可以执行以下操作:Navigation.RemovePage(Navigation.NavigationStack[索引]);
或者您可以使用
InsertPageBefore()
后跟PopAsync()
,如 navigation docs 示例所示:
These methods enable a custom navigation experience, such as replacing a login page with a new page, following a successful login. The following code example demonstrates this scenario:
async void OnLoginButtonClicked(object sender, EventArgs e)
{
if (IsValid)
{
Navigation.InsertPageBefore(new MainPage (), this);
await Navigation.PopAsync();
}
else
{
// Login failed
}
}