呈现为NavigationPage时MasterDetailPage中断

时间:2019-12-20 10:59:42

标签: c# xamarin xamarin.forms

我想创建一个带有导航抽屉的应用程序。因此,应通过抽屉的“链接”项访问每个​​页面。

要保护这些页面,应仅可在有效会话上访问该应用程序,否则应呈现登录页面。

我正在尝试解释到目前为止为复制目的所做的事情...

创建新的Xamarin表单项目后,我创建了一个MainPage,其中包含抽屉和当前呈现的页面

public class MainPage : MasterDetailPage
{
    public MainPage()
    {
        Master = new MasterPage();
        Detail = new NavigationPage(new DummyPage()); // Set initial page
    }
}

因此,母版页(抽屉)目前为空

internal class MasterPage : ContentPage
{
    public MasterPage()
    {
        Title = "Master";
        Content = new StackLayout { Children = { } };
    }
}

与渲染的DummyPage相同

class DummyPage : ContentPage
{
    public DummyPage()
    {
        Title = "Dummy";
        Content = new StackLayout { Children = { new Label { Text = "Dummy Page" } } };
    }
}

因此,如果没有LoginPage,我的App文件将如下所示

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
        MainPage = new MainPage();
    }
}

呈现的应用程序随后看起来不错

enter image description here

当我尝试在访问主应用程序部分之前呈现LoginPage时,我会做类似的事情

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        Page initialPage;

        if (false) // check if logged in
        {
            initialPage = new LoginPage();
        }
        else
        {
            initialPage = new MainPage();
        }

        MainPage = new NavigationPage(initialPage);
    }
}

不幸的是,呈现的MainPage看起来像

enter image description here

我该如何解决?什么遗漏或出了什么问题?


更新 我发现可以全局设置当前显示的页面。所以一开始我就做

    public App()
    {
        InitializeComponent();

        Page initialPage;

        if (isLoggedIn)
        {
            initialPage = new LoginPage();
        }
        else
        {
            initialPage = new MainPage();
        }

        MainPage = initialPage;
    }

并且当我单击LoginPage上的“登录”按钮时,我不执行

SignInCommand = new Command(() =>
{
    await Application.Current.MainPage.Navigation.PushAsync(new MainPage());
});

这对我有用

SignInCommand = new Command(() =>
{
    Application.Current.MainPage = new MainPage();
});

2 个答案:

答案 0 :(得分:1)

您应该尝试这个

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
        MainPage = new MainPage(false);
    }
}

public class MainPage : MasterDetailPage
{
    public MainPage(bool value)
    {
        Master = new MasterPage();
        Detail = value ? new NavigationPage(new LoginPage()) : new NavigationPage(new DummyPage());
    }
}

我认为导航不会添加主容器。

答案 1 :(得分:0)

似乎您将MasterDetailPage放在了NavigationPage中。实际上,这样做是不合适的。您可以像下面这样改善代码

public partial class App : Application
{
    public App()
    {
        InitializeComponent();


        if (false) // check if logged in
        {       
           MainPage = new NavigationPage(initialPage);
        }
        else
        {
            MainPage = new MainPage();
        }  
    }
}