如何在Xamarin.Forms中从NavigationStack中移除模态页面

4
这是关于我的导航的一个示例:
LoginPage ( Login_Click  ) -> MainPage   | Block BackButton
MainPage  ( Logout_Click ) -> LoginPage  | Block going back to the MainPage

目前,我正在使用这段代码在成功登录后显示MainPage

 await Navigation.PushModalAsync(new MainPage());

我不希望用户通过点击PreviousButton(Android)返回到登录页面。

退出登录时同样如此。

是否有办法在成功登录后从导航栈中移除登录页面(并在退出登录时移除主页面)?

注意:

这是模态的。 我没有使用NavigationPage。

2个回答

8
你正在寻找 PopToRootAsync。当用户输入必要信息并点击登录按钮后,您进行登录验证,如果成功,您将设置一个新的 MainPage,然后执行 PopToRootAsync 操作,弹出除根页以外的所有页面。 更新:由于不同平台上的 PopToRootAsync 操作方式不同,您需要从一个 NavigationPage 开始,但可以在登录流程完成后将其作为根页面移除。
因此,在您的应用程序构造函数中,不仅需要创建您的 LoginPage,还需要将其放置在 NavigationPage 中,但是要 隐藏导航栏,以免影响您的 LoginPage 页面布局。
public App()
{
    var navPage = new NavigationPage(new LoginPage());
    NavigationPage.SetHasNavigationBar(navPage.CurrentPage, false);
    MainPage = navPage;
}

然后在你的LoginPage中,你可以将Application.Current.MainPage设置为任何Page类(不必是NavigationPage),然后PopToRootAsync到达它,并从导航层次结构中完全删除你的LoginPage

public partial class LoginPage : ContentPage
{
    public LoginPage()
    {
        InitializeComponent();
        loginDone.Clicked += OnLoginClick;
    }
    async void OnLoginClick(object sender, EventArgs e)
    {
        // If Login is complete/successful - set new root page
        if (YourLoginMethod()) {
            Application.Current.MainPage = new MainApplicationPage();
            // Pops all but the root Page off the navigation stack, with optional animation.
            await Navigation.PopToRootAsync(true);
        }
    }
}

注意:此技术仅在 iOSAndroid 上测试过。

看起来不错 - 感谢您的回答。不幸的是,我遇到了一个 System.InvalidOperationException: PopToRootAsync 在 Android 上不受全局支持,请使用 NavigationPage。 为什么会这样? - Felix D.
@FeDe 我更新了我的答案,以处理在各个平台上如何执行 PopToRootAsync 的方式。 - SushiHangover
非常感谢!我一回到家就会测试这个,不过它已经看起来相当不错了。反正对我来说,Android和iOS是最重要的:D - Felix D.
非常感谢你,这帮了我很多!我需要做一些小改动,但是这个想法很棒:D 谢谢:D - Felix D.
太好了,谢谢。虽然有很多解决方案可用,但这是一种完整的适用于登录验证类型应用的解决方案。 - N Khan

1
不要将您不再需要的新页面推送到NavigationStack中,只需将App.MainPage设置为新页面即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接