我正在尝试使用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;
}
}
解决方案以及生成的屏幕截图可在GitHub找到.
我的想法是在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();