在 xamarin 表单 droid 项目中的导航栏上显示母版页

display master page over navigation bar in xamarin forms droid project

对于那些曾经在Java中为Android编写代码的人,我相信您会立即理解这个概念,而其他人可能不会,但是没关系,我会尽力而为尝试解释我的意思。

我有这个项目,公司一,在工作中交付,我必须开发一个应用程序,除其他外,包含导航抽屉概念形式 material 设计,但适应公司的adm 最喜欢 "concept" 的开发,即 Xamarin(在本例中为 Forms)......可以说他们还不理解它背后的概念(很可能是儿童游戏应用程序)并且需要一个 B2C 应用程序,非常专业,用 THAT 开发... -_-

无论如何,在我设法找到并不得不面对的大量其他问题中,有一个是:导航抽屉(a.k.a。这里是母版页)需要显示在 AppCompatBar(这里导航栏),因为,好吧,因为这就是使用 Android 时应该感受到的,这就是它与其他所有应用程序的工作方式,这就是它设计的工作方式,以及它必须如何工作,但猜猜是什么?没有进入 Xamarin Forms...

我已经尝试了 https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/master-detail-page/,网络上的几个博客和论坛(当然,除了他们的,因为 3 个月后我还在等待一个非常简单的答案,并且该项目必须很快作为演示呈现),他们的书“创造 Xamarin.Forms 的移动应用程序”,Charles Petzold,在线视频,什么都没有,没有关于如何在调用时在导航栏上显示母版页的线索...

这是xaml中主页的代码:

<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
              xmlns:local="clr-namespace:Mobile.UI.Pages;assembly=Mobile"
              x:Class="Mobile.UI.Pages.MainPage"
              BackgroundColor="White"
              IsGestureEnabled="False"
              MasterBehavior="Default">

<MasterDetailPage.Master>
    <local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>

<MasterDetailPage.Detail>
    <NavigationPage
        BarBackgroundColor="#27C6E5">
        <x:Arguments>
            <local:ItemListPage />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>

母版页也在xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Mobile.UI.Pages.MasterPage"
         Icon="menu.png"
         Title="Menu">

<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness"
                iOS="0, 20, 0, 0" />
</ContentPage.Padding>

<StackLayout
    VerticalOptions="FillAndExpand">

    <StackLayout
        VerticalOptions="Fill"
        HorizontalOptions="Fill"
        HeightRequest="128"
        Orientation="Vertical"
        BackgroundColor="White"
        Padding="4">

        <Image
            Source="favicon.png"
            HeightRequest="128"
            WidthRequest="200"
            VerticalOptions="Center"
            HorizontalOptions="Center" />
    </StackLayout>

    <ListView
        x:Name="menuList"
        VerticalOptions="FillAndExpand"
        SeparatorVisibility="None"
        HasUnevenRows="False">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ImageCell
                    ImageSource="{Binding IconSource}"
                    Text="{Binding Title}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

它的代码隐藏:

public ListView ListView
    {
        get
        {
            return menuList;
        }
    }

    public MasterPage()
    {
        InitializeComponent();

        Padding = 0;

        var menuListItems = new List<MenuListItem>();

        menuListItems.Add(new MenuListItem()
        {
            Title = "Items",
            IconSource = "items.png",
            TargetType = typeof(ItemListPage)
        });

        menuListItems.Add(new MenuListItem()
        {
            Title = "Chat",
            IconSource = "chat.png",
            TargetType = typeof(ChatListPage)
        });

        menuList.ItemsSource = menuListItems;
    }

还有我的主页:

public partial class MainPage : MasterDetailPage
{
    public MainPage()
    {
        InitializeComponent();

        masterPage.ListView.ItemTapped += ListView_ItemTapped;

        if (Device.OS == TargetPlatform.WinPhone)
        {
            Master.Icon = "menu.png";
        }
    }

    private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
    {
        var item = e.Item as MenuListItem;

        if (item != null)
        {
            Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType))
            {
                BarBackgroundColor = Color.FromRgb(204, 204, 204),
                Title = item.Title
            };

            masterPage.ListView.SelectedItem = null;

            IsPresented = false;
        }
    }
}

您还需要什么,请尽管问...

有什么帮助吗?

提前致谢...

对我来说,关键是要确保 Android activity 继承自 FormsAppCompatActivity。

This 博客 post 让我们走上正轨。