这是我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)
返回登录页面来返回。
注销时的情况相同。
有没有办法在成功登录后从导航堆栈中删除登录页面(并在注销时删除主页)?
注意:
这是模态的。我没有使用导航页面。
您正在寻找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);
}
}
}
注意:仅在iOS
和Android
上测试了此技术
无需将新页面推送到不再需要的 NavigationStack 上,只需将 App.MainPage 设置为新页面即可。