【问题标题】:MasterDetailPage breaks when rendered as NavigationPageMasterDetailPage 在呈现为 NavigationPage 时中断
【发布时间】:2019-12-20 10:59:42
【问题描述】:

我想创建一个带有导航抽屉的应用程序。所以每个页面都应该可以通过抽屉“链接”项访问。

为了保护这些页面,应用程序应该只能在有效会话中访问,否则应该呈现登录页面。

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

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

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

所以 MasterPage(抽屉)现在是空的

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

渲染的应用程序看起来不错

当我尝试在访问主应用程序部分之前呈现 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 看起来像

我该如何解决这个问题?有什么遗漏或错误?


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

    public App()
    {
        InitializeComponent();

        Page initialPage;

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

        MainPage = initialPage;
    }

当点击登录页面上的“登录”按钮时,我不执行

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

这对我有用

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

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案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());
        }
    }
    

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

    【讨论】:

    • 是的,这会起作用,但是当我按下 LoginPage 上的登录按钮时,我该如何重定向到 MainPage?目前我做await Application.Current.MainPage.Navigation.PushAsync(new MainPage());
    • 您在主页上为此逻辑编写代码。 MainPage = new MainPage();如果你登录页面,你写这个代码。
    • 我接受了您的回答,但您对我的更新解决方案有何看法? :)
    • 我认为当用户从应用程序登录时,您应该旋转另一个不存在主页的页面。 SignInCommand = new Command(() => { await Application.Current.MainPage.Navigation.PushAsync(new AnotherPage()); });
    【解决方案2】:

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

    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
    
    
            if (false) // check if logged in
            {       
               MainPage = new NavigationPage(initialPage);
            }
            else
            {
                MainPage = new MainPage();
            }  
        }
    }
    

    【讨论】:

    • 抱歉,这样做并且在登录命令 await Application.Current.MainPage.Navigation.PushAsync(new MainPage()); 上执行此操作时,应用程序再次呈现 false
    • 在命令中调用Application.Current.MainPage = new MainPage()
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2022-01-16
    • 2016-05-23
    • 2011-09-19
    • 2018-07-29
    • 2012-06-12
    • 2017-01-07
    相关资源
    最近更新 更多