Xamarin.forms 什么';在XamarinShell中实现登录页面的正确方法是什么?
我的应用程序有这样的结构 启动页面=>登录页面=>主页面 登录后,用户无法返回登录/启动页面。弹出式菜单中有几个页面,用户可以进入。但是,登录/启动项不应显示在这些弹出菜单项中Xamarin.forms 什么';在XamarinShell中实现登录页面的正确方法是什么?,xamarin.forms,Xamarin.forms,我的应用程序有这样的结构 启动页面=>登录页面=>主页面 登录后,用户无法返回登录/启动页面。弹出式菜单中有几个页面,用户可以进入。但是,登录/启动项不应显示在这些弹出菜单项中 一些项目可能会尝试先加载主页,然后再将登录页面显示为模式页面。我认为这种方法不起作用,因为在将用户发送回登录之前,加载复杂的主页需要花费大量时间。您应该这样创建。在App.xaml.cs中调用您的第一个ContentPage(登录页) 从LoginPage,您可以验证字段并与api同步。根据响应(成功/失败),您可以重定
一些项目可能会尝试先加载主页,然后再将登录页面显示为模式页面。我认为这种方法不起作用,因为在将用户发送回登录之前,加载复杂的主页需要花费大量时间。您应该这样创建。在App.xaml.cs中调用您的第一个ContentPage(登录页) 从LoginPage,您可以验证字段并与api同步。根据响应(成功/失败),您可以重定向到主页(主页) 关于Android的启动页面,请看这个
对于iOS中的启动页面,请查看此最好的方法是使用此代码将您的登录页面设置为登录页面
MainPage = new NavigationPage(new LoginPage());
然后在成功登录后,使用以下代码导航到ShellApp
Application.Current.MainPage = new AppShell();
然后您可以使用Xam.SettingsPlugin
存储您的令牌和用户ID。
要注销,请使用以下代码从AppShell导航
Application.Current.MainPage = new NavigationPage(new LoginPage());
Xamarin forms github repo发出增强请求,请求内置登录页面,以下是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;
}
}
这对我很有用。。希望它也能帮助你们:)我已经用这种方式实现了
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
}
}
登录屏幕的主要目标是只在用户未登录应用程序时显示。 答案只涉及解决方案的一部分。下面是我如何归档我的登录解决方案。 我的目标:当应用程序启动时,检查用户是否已登录。如果是,则转到主页,否则转到登录页。同样的原理也可以用于显示应用程序首次运行的屏幕 下载
替换AppShell.xaml中项目的顺序
<!-- Your Pages -->
<TabBar Route="main">
<Tab Title="Browse" Icon="tab_feed.png">
<ShellContent ContentTemplate="{DataTemplate local:ItemsPage}" />
</Tab>
<Tab Title="About" Icon="tab_about.png">
<ShellContent ContentTemplate="{DataTemplate local:AboutPage}" />
</Tab>
</TabBar>
<ShellItem Route="login">
<ShellContent ContentTemplate="{DataTemplate local:LoginPage}" />
</ShellItem>
我想创建两个AppShell。一个是校长,还有我申请的所有菜单。另一个只有一个登录页面 因此,您可以在一个应用程序和另一个应用程序之间切换
MainPage = new AppShell();
MainPage = new LoginAppShell();
Forms Vesion:4.6使登录流程变得非常简单。这是到的链接。开发人员可以灵活地选择Shell的
CurrentItem
,而不考虑AppShell.xaml
文件中定义的项目顺序。这可以在AppShell.xaml
以及AppShell.xaml.cs
检查App.xaml.cs中的登录状态,并相应地将参数发送到AppShell文件
public App()
{
InitializeComponent();
if (isLogged)
{
MainPage = new AppShell("mainpage");
}
else
{
MainPage = new AppShell("loginpage");
}
}
在AppShell.Xaml中定义应用程序结构
<ShellItem>
<ShellContent x:Name="loginpage"
ContentTemplate="{DataTemplate views:LoginPage}"
Route="loginpage" />
</ShellItem>
<TabBar x:Name="mainpage" Route="mainpage">
<ShellContent Title="Dashboard" ContentTemplate="{DataTemplate views:DashboardPage}" />
<ShellContent Title="Finance" ContentTemplate="{DataTemplate views:FinancePage}" />
<ShellContent Title="Profile" ContentTemplate="{DataTemplate views:ProfilePage}" />
</TabBar>
在引用ShellItem
的x:Name
属性时选择CurrentItem
。
CurrentItem
属性可以通过Shell在任何类中设置。当前静态属性:
Shell.Current.CurrentItem=登录页面
从AppShell中隐藏启动、注册、登录等页面
弹出式菜单,您可以使用自定义的弹出式项目
它返回的视图没有对应ShellContent的高度
页面
@Matthew Bailey的这篇文章很好地解释了如何实现它
对于不希望显示为菜单选项的页面,创建一个DataTemplate
,该模板返回一个没有高度的视图
隐藏的ShellItem
DataTemplate
示例:
<DataTemplate x:Key="FlyoutHiddenItemTemplate">
<BoxView HeightRequest="0"/>
</DataTemplate>
@davidortinau的这篇文章是实现此解决方案的一个很好的起点 我已经试过了。但当我将应用程序的主页更改为XamarinShell容器时,它就相当滞后了。我可以为此操作进行页面转换吗@您需要定制侧抽屉或菜单视图,对吗?根据我的观点,使用MasterDetailPage很容易,我们也可以轻松定制,因为弹出菜单是Xamarin Shell的一部分,将在Xamarin Form 4.0中提供。目前,我在这个项目中使用Xamarin Form 4.0 preview 4。你检查了吗?我知道这种弹出式菜单控件。但我认为Xamarin Shell提供了更灵活的解决方案,可以解决Xamarin表单中的所有导航问题。您尝试过注销吗?将shell替换为登录页面。当我尝试注销时,调用SwitchToLogin方法,它不起作用,应用程序留在appshell中。我可能做错了什么?拥有xaml公共类viewmodel的viewmodel:ViewModelBase{public ICommand LogoutCommand{get;set;}public viewmodel(){LogoutCommand=new Command(()=>Logout());}public void Logout(){//注销用户SystemEnvironment.UserCurrentSession=null;App.Instance.SwitchToLogin();}根据我的经验,在appshell.xaml中,这不起作用。当导航回登录页时,登录页没有正确呈现。你可以看到@valentasm的答案是:谢谢你。救了我的命。这很好,而且在导航回时登录页呈现正确。唯一的缺点是,它会迫使用户在每次应用启动时都登录s、 这是开发过程中的麻烦。AppShell
constructor不接受任何参数,您从哪里获得此示例?请查看完整的示例。如果您从App.Xaml.cs发送参数,它会接受。您是从App.Xaml.cs发送参数吗?
MainPage = new AppShell();
MainPage = new LoginAppShell();
public App()
{
InitializeComponent();
if (isLogged)
{
MainPage = new AppShell("mainpage");
}
else
{
MainPage = new AppShell("loginpage");
}
}
<ShellItem>
<ShellContent x:Name="loginpage"
ContentTemplate="{DataTemplate views:LoginPage}"
Route="loginpage" />
</ShellItem>
<TabBar x:Name="mainpage" Route="mainpage">
<ShellContent Title="Dashboard" ContentTemplate="{DataTemplate views:DashboardPage}" />
<ShellContent Title="Finance" ContentTemplate="{DataTemplate views:FinancePage}" />
<ShellContent Title="Profile" ContentTemplate="{DataTemplate views:ProfilePage}" />
</TabBar>
public AppShell(string currentItem)
{
InitializeComponent();
Shell shell = new Shell();
switch (currentItem)
{
case "login":
shell.CurrentItem = loginpage;
break;
case "mainpage":
shell.CurrentItem = mainpage;
break;
}
}
<DataTemplate x:Key="FlyoutHiddenItemTemplate">
<BoxView HeightRequest="0"/>
</DataTemplate>
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
if(item is BaseShellItem flyoutItem)
{
//Example: If the item has no title? we do not want to show it.
if (string.IsNullOrWhiteSpace(flyoutItem.Title))
return FlyoutHiddenItemTemplate;
}
return NavigationItemTemplate;
}