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);
}
}
}
注意:仅在 iOS
和 Android
上测试了此技术
与其将新页面推送到您不再需要的 NavigationStack,不如将 App.MainPage 设置为新页面。
这是我的例子 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);
}
}
}
注意:仅在 iOS
和 Android
与其将新页面推送到您不再需要的 NavigationStack,不如将 App.MainPage 设置为新页面。