我的Xamarin Forms应用程序中有2页。我的第一页在工具栏中有4个图标。我的第二页是登录页面,工具栏中有一个勾号和一个十字。
除非我将其设为导航页面,否则我无法显示登录页面以显示任何图标。我还必须在调用PushAsync()之前在第一页上清除ToolBarItems,否则它会抱怨工具栏项太多了。
如果我在登录页面上调用PopAsync(),它就不会返回到第一页。我猜测这是因为它们是2个导航页面。我也试过PopToRootAsync()。然后返回按钮。
我的问题是 - 如何以允许导航工作的方式在2个不同的页面上显示不同的工具栏图标?
我在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
答案 0 :(得分:3)
您可以尝试的一件事是将您的登录页面保留在NavigationPage
内,然后在登录页面成功登录后不再运行PopAsync()
,只需替换{{1使用旧的导航页面:
在您的App类中:
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);
}
否则,我还为iOS上的private async void OnCreateClicked(object sender, EventArgs e) {
bool loginInfoIsGood = CheckLoginInfo(); //Check their login info
if(loginInfoIsGood) {
Application.Current.MainPage = App.AppNavPage;
}
}
做了一个自定义渲染器,将工具栏项插入导航栏的右侧,并覆盖了Android上的一些NavigationRenderer
相关内容以更改图标文本/颜色。
答案 1 :(得分:1)
您拥有的一个选项,以及我在自己的应用中实现的一个选项,是一个自定义渲染器,可以从应用中删除导航标题,然后您可以构建自己的自定义标题。使用这种方法,您确实失去了应用程序的一些原生感觉,并且您必须实现自己的大部分过渡功能。但是,它可以让您更好地控制外观。
删除navigationBar的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),因此我不知道它是否与您的应用程序相关。
编辑:您可能需要针对不同的页面类型更改此渲染器。