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

How to remove a modal page from NavigationStack in Xamarin.Forms

这是我的例子 Navigation:

LoginPage ( Login_Click  ) -> MainPage   | Block BackButton
MainPage  ( Logout_Click ) -> LoginPage  | Block going back to the MainPage

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

 await Navigation.PushModalAsync(new MainPage());

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

注销时同样的情况。

有没有办法在成功登录后从 NavigationStack 中删除 LoginPage(并在注销时删除 MainPage)?

注意:

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

您正在寻找 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 class( 不是 必须是a 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

上测试了此技术

与其将新页面推送到您不再需要的 NavigationStack,不如将 App.MainPage 设置为新页面。