Xamarin Forms的MasterDetailPage在iOS上没有显示菜单图标

5

我有一个Xamarin.Forms项目。 我在NavigationPage内部有MasterDetailPage。 我设置了MasterDetailPage的icon属性,这样图标应该被设置为导航栏左上角的位置。但是它不起作用。

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

        var masterDetailpage = new MasterDetailPage {
            Icon = "menuIcon.png",
            Master = new Page { Title = "Sample"},
            Detail = new Page()
        };

        MainPage = new NavigationPage(masterDetailpage);
    }
}

这种方法行不通。如果我将NavigationPage作为MasterDetailPage的Detail属性,并在Master上设置图标,它可以工作。但是将MasterDetailPage放入NavigationPage中而非相反是非常重要的。


我可能错了。但是 Xamarin 文档只在主细节页面中显示 Android 版本的页面图标,或者你指的是其他什么?https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/navigation/master-detail-page/ - Lepidopteron
默认情况下,iOS 上不会显示图标,但通常可以在 iOS 上添加图标,并将其作为页面的图标属性添加。这在某些情况下有效,但在我的情况下不起作用。 - mister_giga
导航页面是否可能覆盖此属性设置? - Lepidopteron
我不知道。文档中解释说导航页应该设置为MasterDetailPage的详细页。但我不想这样。 - mister_giga
你设置了详细页面吗? - Enrico Rossini
当然,否则我会遇到运行时异常。 - mister_giga
5个回答

6
解决方法是设置用于主控制器的页面的Icon属性。
 var masterDetailpage = new MasterDetailPage {            
        Master = new Page { Title = "Sample", Icon = "menuIcon.png"},
        Detail = new NavigationPage(new Page())
    };

假设你在 iOS 项目的“资源”文件夹下有一个名为menuIcon.png的 png 图片,这是你想要的汉堡图标。你还需要在Detail周围使用NavigationPage,因为Icon会显示在导航栏区域。


谢谢,但如果您在最后阅读了我的问题,我写了你所写的内容。但这种结构的工作方式不同,这就是为什么我想要将MasterDetailPage放在NavigationPage内而不是你提到的方式。 - mister_giga

3
Unicode字符可以用来显示“汉堡包”菜单图标。
您可以在主页ContentPage顶级标记中指定Title="☰"。
如果您使用图标,可以绘制比字符更好的图标。但是,如果这对您可接受,使用Unicode字符就足够简单了。
它适用于iOS,不会破坏Android。
链接:
- 天卦(U+2630) - 菜单图标(“navicons”)的Unicode字符☰

0
如果您将主页面包装在导航页面中,请将图标放在导航页面上。
这对我很有效:
public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        var masterDetailpage = new MasterDetailPage {
            Icon = "menuIcon.png",
            Master = new Page { Title = "Sample"},
            Detail = new Page()
        };

        MainPage = new NavigationPage(masterDetailpage) { Title = "Sample", Icon = "menuIcon.png" };
    }
}

0
如果有帮助的话,您可以在设置MainPage之前设置菜单的标题,就像我在下面的示例代码中所做的那样:
var master = new MasterPage();
master.Master.Icon = "my_icon.png";
master.Master.Title = AppResources.Menu; // To get the value from resource files
MainPage = master;

MasterPage 继承自 MasterDetailsPage,但由于 Xamarin 的奇怪错误,我无法直接在 MasterPage 的构造函数中设置值。


-1

我认为你需要在你的AddDelegate中添加一个通用的修复。

namespace myApp.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : 
                         global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        UIWindow window;

        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();

            // fix for iOS
            window = new UIWindow(UIScreen.MainScreen.Bounds);
            window.RootViewController = App.GetMainPage().CreateViewController();
            window.MakeKeyAndVisible();

            LoadApplication(new App());

            return base.FinishedLaunching(app, options);
        }
    }
}

在您的 PCL 项目中的 App.xaml.cs 文件中,您需要添加以下内容。
public App()
{
    // The root page of your application
    MainPage = GetMainPage();
}

public static Page GetMainPage()
{
    return new RootPage();
}

很不幸,这是误导性的,并不能解决问题。你提出的代码对于LoadApplication所做的工作和base.FinishedLaunching的调用来说是多余的。 - therealjohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接