是否有 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 Android 开发的免费条码扫描替代方案

如何在 VS 2019 上混淆 xamarin 应用程序

Xamarin.iOS:如何将 NavigationBar 添加到视图

Xamarin Forms Shell 是不是有删除导航栏但保留汉堡图标的方法?

添加 Xamarin 插件时出错

Xamarin IOS 导航与 TableView