显示"返回菜单"带有Xamarin.Forms的iOS导航栏中的按钮

时间:2014-07-11 14:28:33

标签: ios xamarin xamarin.forms navigationbar master-detail

我正在尝试使用C#和Xamarin.Forms构建跨平台应用。它包含以MasterDetailPage形式实现的滑出菜单。虽然在Android上有一个按钮,左上角有应用程序图标,可以切换滑出页面,iOS上没有这样的导航栏项目。

我将其分解为以下来自Xamarin解决方案模板"空白应用程序(Xamarin.Forms Shared)"并替换App - 类的实现:

public class App
{
    static MasterDetailPage MDPage;

    public static Page GetMainPage()
    {
        return new NavigationPage(
            MDPage = new MasterDetailPage {
                Master = new ContentPage {
                    Title = "Master",
                    Content = new StackLayout {
                        Children = { Link("A"), Link("B"), Link("C") }
                    },
                },
                Detail = new ContentPage { Content = new Label { Text = "A" } },
            });
    }

    static Button Link(string name)
    {
        var button = new Button { Text = name };
        button.Clicked += delegate {
            MDPage.Detail = new ContentPage { Content = new Label { Text = name } };
            MDPage.IsPresented = false;
        };
        return button;
    }
}

可以在GitHub找到解决方案以及生成的屏幕截图。

我的想法是添加一个"菜单"或"返回"特定于iOS的代码中的按钮,用于修改window.RootViewController.NavigationController.NavigationBar类中的AppDelegate。但window.RootViewController.NavigationControllernull

GetMainPage()的返回类型替换为NavigationPage而非Page无效。

我可以通过MDPage.ToolbarItems.Add(...)添加工具栏项,但它们会显示在右侧的顶部。

3 个答案:

答案 0 :(得分:5)

<强> TL; DR

基本上,您的Detail页面需要包含在NavigationPage中,以便后退按钮显示在iOS中。


以下是我如何构建应用的示例。

<强> App.cs

    public static INavigation Navigation { get; set; }

    public static Page GetMainPage(IContainer container)
    {
        return new MainPage();
    }

<强> MainPage.cs

public class MainPage : MasterDetailPage
{

    public MainPage()
    {
        Title = "Some Title";
        var master = new MainMenu();
        var detail = new NavigationPage(new FirstPage());

        if (App.Navigation == null)
        {
            App.Navigation = detail.Navigation;
        }

        Master = master;
        Detail = detail;
    }
}

既然您已经完成了这项工作,您的导航抽屉将按预期运行,您的ActionBar也会如此。

如果要在整个应用中导航,请使用静态定义的Navigation

await App.Navigation.PushAsync(new FooPage());
// or
await App.Navigation.PopAsync();

答案 1 :(得分:1)

您在正确的轨道上,您的NavigatePage需要继续详细信息

Detail = new ContentPage { Content = new Label { Text = "A" } }

and

MDPage.Detail = new ContentPage { Content = new Label { Text = name } };

将是

Detail = new NavigationPage(new ContentPage { Content = new Label { Text = "A" } })

and

MDPage.Detail = new NavigationPage(new ContentPage { Content = new Label { Text = name } });

答案 2 :(得分:1)

我终于找到了解决方案。代码基本上需要两个小的修正:

  1. 将所有DetailPage换成NavigationPage,而不是MasterDetailPage(请参阅下面的#1,#2和#3)。
  2. 在iOS上向Icon添加MasterPage(请参阅下面的#4)。不要忘记实际的PNG(!)到iOS资源。
  3. 最低工作示例如下:

    public static class App
    {
        static MasterDetailPage MDPage;
    
        public static Page GetMainPage()
        {
            return MDPage = new MasterDetailPage { // #1
                Master = new ContentPage {
                    Title = "Master",
                    Icon = Device.OS == TargetPlatform.iOS ? "menu.png" : null, // #4
                    Content = new StackLayout {
                        Children = { Link("A"), Link("B"), Link("C") }
                    },
                },
                Detail = new NavigationPage(new ContentPage { Content = new Label { Text = "A" } }), // #2
            };
        }
    
        static Button Link(string name)
        {
            var button = new Button { Text = name };
            button.Clicked += delegate {
                MDPage.Detail = new NavigationPage(new ContentPage { Content = new Label { Text = name } }); // #3
                MDPage.IsPresented = false;
            };
            return button;
        }
    }