我的Xamarin Forms应用程序中有两个页面。我的第一页工具栏上有4个图标。我的第二个页面是一个登录页面,工具栏上有一个勾号和一个叉号。
我无法让登录页面显示任何图标,除非我将其设置为导航页面。在调用PushAsync()之前,我还必须清除第一页上的ToolBarItems,否则它会抱怨工具栏项目太多。
如果我在登录页面上调用PopAsync(),它不会返回到第一个页面。我猜这是因为它们是两个导航页面。我也尝试了PopToRootAsync()。但是后退按钮可以工作。
我的问题是,如何在两个不同的页面上显示不同的工具栏图标,使导航正常工作?
我正在Windows Phone 8.0 上测试
以下是调用登录页面的代码:
private async void ShowLoginPage()
{
ToolbarItems.Clear();
var page = new NavigationPage(new LoginPage());
await Navigation.PushAsync(page);
}
这是返回第一页的代码:
private void Cancel()
{
Navigation.PopToRootAsync();
}
我正在运行Xamarin.Forms v1.2.2.6243
您可以尝试的一件事是将登录页面保留在NavigationPage
中,然后在他们成功登录后,不要在登录页面中运行PopAsync()
,只需将MainPage
替换为旧的导航页面:
在您的应用程序类中:
public NavigationPage AppNavPage = new NavigationPage(new FirstPage());
public App() {
MainPage = AppNavPage;
}
在您的第一页:
private async void ShowLoginPage() {
ToolbarItems.Clear();
var page = new NavigationPage(new LoginPage());
await Navigation.PushAsync(page);
}
在登录页面:
private async void OnCreateClicked(object sender, EventArgs e) {
bool loginInfoIsGood = CheckLoginInfo(); //Check their login info
if(loginInfoIsGood) {
Application.Current.MainPage = App.AppNavPage;
}
}
除此之外,我还在iOS上为NavigationRenderer
做了一个自定义渲染器,将工具栏项目插入导航栏的右侧,并在Android上覆盖了一些与Menu
相关的内容,以更改图标文本/颜色。
您拥有的一个选项,也是我在自己的应用程序中实现的一个,是一个自定义渲染器,它可以从应用程序中删除导航标头,然后您可以构建自己的自定义标头。有了这种方法,你确实失去了应用程序的一些原生感觉,你必须自己实现大部分过渡功能。然而,它让你对外观有了更多的控制。
删除导航栏的CustomRenderer:
//add using statements
// add all view here that need this custom header, might be able to build a
//base page that others inherit from, so that this will work on all pages.
[assembly: ExportRenderer(typeof(yourView), typeof(HeaderRenderer))]
class HeaderRenderer : PageRenderer
{
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
this.NavigationController.SetNavigationBarHidden(true, true);
}
}
之后,您可以构建一个可以放置在每个页面顶部的头视图(我使用的是xaml),所以我不知道它是否与您的应用程序相关。
编辑:您可能需要针对不同的页面类型更改此呈现器。