主详细信息页面内的选项卡式页面 Xamarin
Tabbed Page Inside Master Detail Page Xamarin
我正在尝试添加一个选项卡式页面,如 xamarin 文档中所示,但我不断收到以下错误,System.NullReferenceException "Object reference not set to an instance of an object." 我需要为每个页面声明一个新对象还是这在使用 xaml?
时自动完成
这是我的 StackTrace,
at Xamarin.Forms.Platform.Android.AppCompat.Platform.LayoutRootPage(Xamarin.Forms.P age page, Int32 width, Int32 height) [0x0005d] in C:\BuildAgent\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\AppCompat\Plat form.cs:279
at Xamarin.Forms.Platform.Android.AppCompat.Platform.Xamarin.Forms.Platform.Android.IPlatformLayout.OnLayout (Boolean changed, Int32 l, Int32 t, Int32 r, Int32 b) [0x00003] in C:\BuildAgent\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:196
at Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout (Boolean changed, Int32 l, Int32 t, Int32 r, Int32 b) [0x0000e] in C:\BuildAgent\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\PlatformRenderer.cs:73
at Android.Views.ViewGroup.n_OnLayout_ZIIII (IntPtr jnienv, IntPtr native__this, Boolean changed, Int32 l, Int32 t, Int32 r, Int32 b) [0x00009] in /Users/builder/data/lanes/3415/7db2aac3/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.Views.ViewGroup.cs:3427
at (wrapper dynamic-method) System.Object:d59f31f1-b9b6-40ea-9254-a422fe409750 (intptr,intptr,bool,int,int,int,int)
这是我的代码,
using Xamarin.Forms;
namespace BSi.Mobile.Events.Views
{
public partial class MainMasterDetailPage : MasterDetailPage
{
public MainMasterDetailPage()
{
InitializeComponent();
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
xmlns:local="clr-namespace:BSi.Mobile.Events.Views;assembly=BSi.Mobile.Events"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="BSi.Mobile.Events.Views.MainMasterDetailPage">
<MasterDetailPage.Master>
<ContentPage Title="Default" Padding="10">
<StackLayout>
<Button Text="Home" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\MainPage"/>
<Button Text="Event Schedule" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\EventPage"/>
<Button Text="Floor Plan" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\FloorPlanPage"/>
<Button Text="Sponsor/Media Partners" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\SponsorsPage"/>
<Button Text="Where To Eat" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\FoodNearbyPage"/>
</StackLayout>
</ContentPage>
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<TabbedPage>
<TabbedPage.Children>
<local:MainPage Title="Info" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
<local:EventPage Title="Sessions" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
<local:SpeakersPage Title="Speakers" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
<local:ExhibitsPage Title="Exhibits" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
</TabbedPage.Children>
</TabbedPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
更新:
我按照 SushiHangover 的建议进行了一些更改,现在我没有收到任何错误,但我的选项卡式菜单没有出现。
您可以在 XAML 中添加 TabbedPage
Children:
<MasterDetailPage.Detail>
<TabbedPage>
<TabbedPage.Children>
<ContentPage Title="Page 1" Icon="ja.png" />
<ContentPage Title="Page 2" Icon="ja.png" />
<ContentPage Title="Page 3" Icon="ja.png" />
</TabbedPage.Children>
</TabbedPage>
</MasterDetailPage.Detail>
只需将 "local" 自定义页面替换为 ContentPage
或通过代码:
public TabsPage ()
{
this.Children.Add (new ContentPage () { Title = "Page 1", Icon = "ja.png" });
this.Children.Add (new ContentPage () { Title = "Page 2", Icon = "ja.png" });
this.Children.Add (new ContentPage () { Title = "Page 3", Icon = "ja.png" });
}
答案是使用与要在标签页中显示的页面相关的命令参数。
<?xml version="1.0" encoding="utf-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="BSi.Mobile.Events.Views.MainMasterDetailPage">
<MasterDetailPage.Master>
<ContentPage Title="Default">
<StackLayout>
<StackLayout BackgroundColor="{StaticResource iconGray}" Padding="15" HeightRequest="100">
<Image Source="canfitpro_logo2" HeightRequest="60" HorizontalOptions="Start" VerticalOptions="EndAndExpand" />
</StackLayout>
<TableView Intent="Form" HasUnevenRows="True">
<TableRoot>
<TableSection Title="Vancouver Fitness Expo">
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="EventTabbedPage/NavigationPage/MainPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_home_circle" HeightRequest="40"/>
<Label Text="Home" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="EventTabbedPage/NavigationEventPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_sessions_circle" HeightRequest="40"/>
<Label Text="Sessions" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
</TableSection>
<TableSection Title="Resources">
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage/FloorPlanPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_floormap_circle" HeightRequest="40"/>
<Label Text="Floor Plan" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage/SponsorsPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_partners_circle" HeightRequest="40"/>
<Label Text="Sponsor / Media Partners" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage/FoodNearbyPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_restaurant_circle" HeightRequest="40"/>
<Label Text="Where To Eat" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
</TableSection>
</TableRoot>
</TableView>
</StackLayout>
</ContentPage>
</MasterDetailPage.Master>
</MasterDetailPage>
我正在尝试添加一个选项卡式页面,如 xamarin 文档中所示,但我不断收到以下错误,System.NullReferenceException "Object reference not set to an instance of an object." 我需要为每个页面声明一个新对象还是这在使用 xaml?
时自动完成这是我的 StackTrace,
at Xamarin.Forms.Platform.Android.AppCompat.Platform.LayoutRootPage(Xamarin.Forms.P age page, Int32 width, Int32 height) [0x0005d] in C:\BuildAgent\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\AppCompat\Plat form.cs:279
at Xamarin.Forms.Platform.Android.AppCompat.Platform.Xamarin.Forms.Platform.Android.IPlatformLayout.OnLayout (Boolean changed, Int32 l, Int32 t, Int32 r, Int32 b) [0x00003] in C:\BuildAgent\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:196
at Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout (Boolean changed, Int32 l, Int32 t, Int32 r, Int32 b) [0x0000e] in C:\BuildAgent\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\PlatformRenderer.cs:73
at Android.Views.ViewGroup.n_OnLayout_ZIIII (IntPtr jnienv, IntPtr native__this, Boolean changed, Int32 l, Int32 t, Int32 r, Int32 b) [0x00009] in /Users/builder/data/lanes/3415/7db2aac3/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.Views.ViewGroup.cs:3427
at (wrapper dynamic-method) System.Object:d59f31f1-b9b6-40ea-9254-a422fe409750 (intptr,intptr,bool,int,int,int,int)
这是我的代码,
using Xamarin.Forms;
namespace BSi.Mobile.Events.Views
{
public partial class MainMasterDetailPage : MasterDetailPage
{
public MainMasterDetailPage()
{
InitializeComponent();
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
xmlns:local="clr-namespace:BSi.Mobile.Events.Views;assembly=BSi.Mobile.Events"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="BSi.Mobile.Events.Views.MainMasterDetailPage">
<MasterDetailPage.Master>
<ContentPage Title="Default" Padding="10">
<StackLayout>
<Button Text="Home" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\MainPage"/>
<Button Text="Event Schedule" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\EventPage"/>
<Button Text="Floor Plan" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\FloorPlanPage"/>
<Button Text="Sponsor/Media Partners" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\SponsorsPage"/>
<Button Text="Where To Eat" Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage\FoodNearbyPage"/>
</StackLayout>
</ContentPage>
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<TabbedPage>
<TabbedPage.Children>
<local:MainPage Title="Info" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
<local:EventPage Title="Sessions" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
<local:SpeakersPage Title="Speakers" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
<local:ExhibitsPage Title="Exhibits" Icon="http://icons.iconarchive.com/icons/graphicloads/100-flat/256/home-icon.png"/>
</TabbedPage.Children>
</TabbedPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
更新:
我按照 SushiHangover 的建议进行了一些更改,现在我没有收到任何错误,但我的选项卡式菜单没有出现。
您可以在 XAML 中添加 TabbedPage
Children:
<MasterDetailPage.Detail>
<TabbedPage>
<TabbedPage.Children>
<ContentPage Title="Page 1" Icon="ja.png" />
<ContentPage Title="Page 2" Icon="ja.png" />
<ContentPage Title="Page 3" Icon="ja.png" />
</TabbedPage.Children>
</TabbedPage>
</MasterDetailPage.Detail>
只需将 "local" 自定义页面替换为 ContentPage
或通过代码:
public TabsPage ()
{
this.Children.Add (new ContentPage () { Title = "Page 1", Icon = "ja.png" });
this.Children.Add (new ContentPage () { Title = "Page 2", Icon = "ja.png" });
this.Children.Add (new ContentPage () { Title = "Page 3", Icon = "ja.png" });
}
答案是使用与要在标签页中显示的页面相关的命令参数。
<?xml version="1.0" encoding="utf-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="BSi.Mobile.Events.Views.MainMasterDetailPage">
<MasterDetailPage.Master>
<ContentPage Title="Default">
<StackLayout>
<StackLayout BackgroundColor="{StaticResource iconGray}" Padding="15" HeightRequest="100">
<Image Source="canfitpro_logo2" HeightRequest="60" HorizontalOptions="Start" VerticalOptions="EndAndExpand" />
</StackLayout>
<TableView Intent="Form" HasUnevenRows="True">
<TableRoot>
<TableSection Title="Vancouver Fitness Expo">
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="EventTabbedPage/NavigationPage/MainPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_home_circle" HeightRequest="40"/>
<Label Text="Home" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="EventTabbedPage/NavigationEventPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_sessions_circle" HeightRequest="40"/>
<Label Text="Sessions" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
</TableSection>
<TableSection Title="Resources">
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage/FloorPlanPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_floormap_circle" HeightRequest="40"/>
<Label Text="Floor Plan" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage/SponsorsPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_partners_circle" HeightRequest="40"/>
<Label Text="Sponsor / Media Partners" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
<ViewCell>
<StackLayout Margin="15, 10, 10, 10" Orientation="Horizontal">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding MenuSelectedCommand}" CommandParameter="NavigationPage/FoodNearbyPage"/>
</StackLayout.GestureRecognizers>
<Image Source="icon_restaurant_circle" HeightRequest="40"/>
<Label Text="Where To Eat" VerticalTextAlignment="Center" Margin="20, 0, 0, 0" Style="{DynamicResource SubtitleStyle}"/>
</StackLayout>
</ViewCell>
</TableSection>
</TableRoot>
</TableView>
</StackLayout>
</ContentPage>
</MasterDetailPage.Master>
</MasterDetailPage>