私のアプリはこのような構造になっています。
スプラッシュページ=>ログインページ=>メインページ
ログイン後、ユーザーはログイン/スプラッシュページに戻ることができません。フライアウトメニューには、ユーザーがアクセスできるページがいくつかあります。ただし、ログイン/スプラッシュ項目はこれらのフライアウトメニュー項目に表示されるべきではありません。
一部のプロジェクトでは、ログインページをモーダルページとして表示する前に、まずメインページをロードしようとする場合があります。ユーザーをログインに戻す前に複雑なメインページをロードするには非常に時間がかかるため、この方法は機能しないと思います。
私はこの方法で実装しました、
public partial class App : Application
{
private AppShell _mainMenu;
private LoginPage _loginPage;
public static App Instance;
public App()
{
InitializeComponent();
// set singleton
Instance = this;
// Check here for previus-login user
if (SystemEnvironment.UserCurrentSession != null)
{
SwitchToMainMenu();
}
else
{
SwitchToLogin();
}
}
public void SwitchToLogin()
{
_loginPage = null;
_loginPage = new LoginPage();
MainPage = _loginPage; // Go to login page
}
public void SwitchToMainMenu()
{
_mainMenu = null;
_mainMenu = new AppShell();
MainPage = _mainMenu; // Go to logged user page
}
protected override void OnStart()
{
// Handle when your app starts
}
protected override void OnSleep()
{
// Handle when your app sleeps
}
protected override void OnResume()
{
// Handle when your app resumes
}
}
App.xaml.csに次の行を追加します。
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new MainPage());
}
認証ファイルに以下を追加します。
async void OnLoginButtonClicked(Object sender, EventArgs e)
{
var user = new User
{
PhoneNumber = PhoneNumberEntry.Text,
Password = PasswordEntry.Text
};
if (user.PhoneNumber == Dummy.PhoneNumber && user.Password == Dummy.Password)
{
Application.Current.MainPage = new AppShell();
}
else
{
messagelabel.Text = "Invalid Login";
PasswordEntry.Text = string.Empty;
}
}
これは私にとってうまくいきました。
2つのAppShellを作成します。 1つはプリンシパルで、私のアプリケーションのすべてのメニューが含まれます。他の1つだけにログインページがあります。
したがって、1つのAppShelと他のAppShelを切り替えることができます。
MainPage = new AppShell();
MainPage = new LoginAppShell();