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

Fel*_* D. 4 c# navigation android xamarin xamarin.forms

这是我的一个例子Navigation:

LoginPage ( Login_Click  ) -> MainPage   | Block BackButton
MainPage  ( Logout_Click ) -> LoginPage  | Block going back to the MainPage
Run Code Online (Sandbox Code Playgroud)

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

 await Navigation.PushModalAsync(new MainPage());
Run Code Online (Sandbox Code Playgroud)

希望用户通过点击PreviousButton(Android)返回到LoginPage返回.

退出时的故事相同.

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

注意:

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

Sus*_*ver 8

你在找PopToRootAsync.因此,您的用户输入所需信息,他们点击登录按钮,您执行登录验证,如果成功,您设置一个新的MainPage,然后PopToRootAsync弹出除导航堆栈之外的所有根页面.

更新:由于PopToRootAsync在各种平台上完成了这种方式,您需要从a开始,NavigationPage但可以在登录过程后将其作为根页删除.

因此,在您的Application构造函数中,不是仅创建您的LoginPage,NavigationPage而是将其放入但隐藏导航栏,以免影响您的LoginPage屏幕布局:

public App()
{
    var navPage = new NavigationPage(new LoginPage());
    NavigationPage.SetHasNavigationBar(navPage.CurrentPage, false);
    MainPage = navPage;
}
Run Code Online (Sandbox Code Playgroud)

然后你中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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:仅在iOS和上测试此技术Android