我正在尝试使用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.NavigationController
为null
。
将GetMainPage()
的返回类型替换为NavigationPage
而非Page
无效。
我可以通过MDPage.ToolbarItems.Add(...)
添加工具栏项,但它们会显示在右侧的顶部。
答案 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)
我终于找到了解决方案。代码基本上需要两个小的修正:
DetailPage
换成NavigationPage
,而不是MasterDetailPage
(请参阅下面的#1,#2和#3)。Icon
添加MasterPage
(请参阅下面的#4)。不要忘记实际的PNG(!)到iOS资源。最低工作示例如下:
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;
}
}