是否有 Xamarin 导航的替代方案?
Posted
技术标签:
【中文标题】是否有 Xamarin 导航的替代方案?【英文标题】:Is it there an alternative to Navigation for Xamarin? 【发布时间】:2021-07-13 09:44:33 【问题描述】:我正在使用 Xamarin.Forms 开发一个 android 应用程序。我的导航有一些问题。
当我使用Navigation.PushAsync(new ContentPage());
时,我的导航流程会创建小圆点。当我按下返回时,我会重新访问那些无法访问的页面。比如我推送这个页面:
登录 (go)> 菜单 (go)> CloseSession (go)> 登录
当我点击Android的返回按钮时,流程是这样的:
登录 (go)> 菜单 (go)> CloseSession (go)> 登录 (goback)> CloseSession (goback)> Menu (goback)> 登录
退出应用程序:
登录 (go)> 菜单 (go)> CloseSession (go)> 登录 (goback)> 应用关闭
我知道如果我使用Navigation.PopAsync();
,最后一个推送页面会从导航堆栈中删除,但对我来说看起来很棘手。有什么方法可以创建导航页面,避免将它们添加到堆栈中?
【问题讨论】:
除了创建一个新的导航堆栈,还有两个选择:1.Remove after adding。 2. 使用 Xamarin Shell 【参考方案1】:我相信您正在尝试做的是“操纵导航堆栈”。
如果您不希望某个页面位于导航堆栈上,您可以在导航离开时立即使用Navigation.RemovePage(page)
将其删除。
您可以传递该页面的已保存引用,或在Navigation.NavigationStack
中查找,如果这是已知场景(您要删除的页面的已知导航堆栈索引),您可以这样做:
Navigation.RemovePage(Navigation.NavigationStack[index]);
或者您可以使用InsertPageBefore()
后跟PopAsync()
,如navigation docs 示例所示:
这些方法可实现自定义导航体验,例如在成功登录后将登录页面替换为新页面。以下代码示例演示了这种情况:
async void OnLoginButtonClicked(object sender, EventArgs e)
if (IsValid)
Navigation.InsertPageBefore(new MainPage (), this);
await Navigation.PopAsync();
else
// Login failed
【讨论】:
【参考方案2】:您不应该使用这样的导航。某些表单(尤其是登录)应在完成后弹出。
-
推送登录表单
用户完成登录
弹出登录表单
决定接下来应该推送哪个表单。
【讨论】:
有没有办法不使用堆栈进行导航?对吗? 我不确定,但我想这几乎是使用导航的必要条件。你只需要了解它是如何工作的。【参考方案3】:在您的场景中,我建议您使用Modal Pages 来显示登录页面。
它将创建一个额外的模态堆栈,不会影响原始堆栈。
当用户完成登录后,弹出登录页面。
流程
将NavigationPage(root page : Main)
设置为App中的MainPage。
使用PushModalAsync
显示登录页面。
完成登录
使用PopModalAsync
关闭登录页面。
【讨论】:
但是使用 Android 上的返回按钮我可以避免登录。【参考方案4】:您可以从任何活动页面打开另一个页面
StartActivity(typeof(YourView));
当该页面完成时,它会将您返回到您调用它的页面。
【讨论】:
我认为它仅适用于 Xamarin.Android 不适用于 Xamarin.Forms以上是关于是否有 Xamarin 导航的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.iOS:如何将 NavigationBar 添加到视图