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;
        }