Xamarin MasterDetailPage 在更新时始终为 null Master 和 Detail

Xamarin MasterDetailPage always null Master and Detail when newing up

我采用了此 Xamarin Forms 演示中所示的方法。

https://github.com/xamarin/xamarin-forms-samples/tree/master/Navigation/MasterDetailPage/MasterDetailPageNavigation

然而,当我创建一个新的 MainPage 时,Master 和 Detail 都是空的...我预计它会分别是我的 MenuPage 和 TabPage。这是错误还是我做错了什么?

主页:

<MasterDetailPage  xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:ctr="clr-namespace:MyApp.Core.Views;assembly=MyApp.Core"
         x:Class="SmartMiner.Core.Views.MainPage"
         >
<MasterDetailPage.Master>
    <ctr:MenuPage x:Name="MenuPage"/>
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
    <ctr:TabPage x:Name="TabPage" />
</MasterDetailPage.Detail>

菜单页面(主)

<ContentPage 
xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
Title="Menu"
x:Name="MenuPage"
x:Class="MyApp.Core.Views.MenuPage"
>
<ContentPage.Content>
</ContentPage.Content>

TabPage(详情)

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
x:Class="MyApp.Core.Views.TabPage"
xmlns:tab="clr-namespace:SmartMiner.Core.Views;assembly=SmartMiner.Core"
Title="Tabs Page"
>
<tab:Tab1 Title="Tab One"/>
<tab:Tab2 Title="Tab Two" />
<tab:Tab3 Title="Tab Three" />

初始化

protected override void OnStart(){
        var mainPage = new MainPage();
        if (Device.RuntimePlatform == Device.iOS)
            MainPage = mainPage;
        else
            MainPage = new NavigationPage(mainPage); 
    }

检查 var mainPage 的结果是属性 Master 和 Detail 为空,MainPage 的指定抛出错误

"Master and Detail must be set before assigning it to MainPage"

我可以发现几个问题。

需要在App构造函数中创建并赋值主页面。也不要将 MainPage 包装在 NavigationPage 中。您可以在详细信息页面中执行此操作。

您的 App.xaml.cs 应如下所示:

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

             MainPage = new MainPage();
        }

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

这是主详细信息页面(您的 MainPage)

<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MasterDetailTest.MainPage"
             xmlns:ctr="clr-namespace:MasterDetailTest">
  <MasterDetailPage.Master>
    <ctr:MenuPage x:Name="MenuPage" />
  </MasterDetailPage.Master>
  <MasterDetailPage.Detail>
    <NavigationPage>
      <x:Arguments>
        <ctr:TabPage x:Name="TabPage" />
      </x:Arguments>
    </NavigationPage>
  </MasterDetailPage.Detail>
</MasterDetailPage>

菜单页

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MasterDetailTest.MenuPage"
             Title="Menu">
    <ContentPage.Content>
    </ContentPage.Content>
</ContentPage>

标签页

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:tab="clr-namespace:MasterDetailTest;assembly=MasterDetailTest"
             x:Class="MasterDetailTest.TabPage">
    <tab:Tab1Page Title="Tab 1" />
    <tab:Tab2Page Title="Tab 2" />
</TabbedPage>

其中一个标签页

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MasterDetailTest.Tab1Page">
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Tab One"
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>