我正在尝试使用C#和Xamarin.Forms构建一个跨平台的应用程序.它包含以MasterDetailPage形式实现的滑出菜单.在
Android上,左上角有一个带有应用程序图标的按钮,用于切换滑出页面,iOS上没有这样的导航栏项目.
我将其分解为以下从Xamarin解决方案模板“Blank App(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; } }
我的想法是在iOS特定的代码中添加这样一个“菜单”或“后退”按钮,修改AppDelegate类中的window.RootViewController.NavigationController.NavigationBar.但是window.RootViewController.NavigationController为null.
用NavigationPage而不是Page替换GetMainPage()的返回类型没有帮助.
我可以通过MDPage.ToolbarItems.Add(…)添加工具栏项,但它们出现在右上角.
解决方法
TL; DR
实质上,您的详细信息页面需要包含在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也将如此.
如果要在整个应用程序中导航,请使用静态定义的导航
await App.Navigation.PushAsync(new FooPage()); // or await App.Navigation.PopAsync();