【问题标题】:Is it there an alternative to Navigation for Xamarin?是否有 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();,最后一个推送页面会从导航堆栈中删除,但对我来说看起来很棘手。是否有 Xamarin 导航的替代方案?有什么方法可以创建导航页面,避免将它们添加到堆栈中?

【问题讨论】:

  • 除了创建一个新的导航堆栈,还有两个选择:1.Remove after adding。 2. 使用 Xamarin Shell

标签: c# android xamarin xamarin.forms navigation


【解决方案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】:

    您不应该使用这样的导航。某些表单(尤其是登录)应在完成后弹出。

    1. 推送登录表单
    2. 用户完成登录
    3. 弹出登录表单
    4. 决定接下来应该推送哪个表单。

    【讨论】:

    • 有没有办法不使用堆栈进行导航?对吗?
    • 我不确定,但我想这几乎是使用导航的必要条件。你只需要了解它是如何工作的。
    【解决方案3】:

    在您的场景中,我建议您使用Modal Pages 来显示登录页面。

    它将创建一个额外的模态堆栈,不会影响原始堆栈。

    当用户完成登录后,弹出登录页面。


    流程

    • NavigationPage(root page : Main)设置为App中的MainPage。
    • 使用PushModalAsync 显示登录页面。
    • 完成登录
    • 使用PopModalAsync关闭登录页面。

    【讨论】:

    • 但是使用 Android 上的返回按钮我可以避免登录。
    【解决方案4】:

    您可以从任何活动页面打开另一个页面

    StartActivity(typeof(YourView));
    

    当该页面完成时,它会将您返回到您调用它的页面。

    【讨论】:

    • 我认为它仅适用于 Xamarin.Android 不适用于 Xamarin.Forms
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2012-09-02
    • 2016-08-06
    相关资源
    最近更新 更多