使用Xamarin Forms在每个页面上显示不同的工具栏按钮

问题描述:

我的Xamarin Forms应用程序中有2个页面。我的第一页在工具栏中有4个图标。我的第二页是登录页面,在工具栏中有一个勾号和一个十字。使用Xamarin Forms在每个页面上显示不同的工具栏按钮

我无法让登录页面显示任何图标,除非我将其设置为导航页面。在调用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

有一个选项,你有一个,我在我自己的应用程序中实现,是一个自定义渲染器,从应用程序中删除导航标题,然后您可以构建自己的自定义标题。采用这种方法,您确实会失去应用程序的本地特性,并且必须实现您自己的大部分过渡功能。但是,它给你更多的控制外观。

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)的顶部的标题视图,所以我不知道这是否是与你申请相关。

编辑:您可能需要为不同的页面类型更改此渲染器。

+0

听起来很有趣。将调查。 – 2014-10-04 00:40:01

+0

如果您需要任何更多的帮助与执行让我知道。 – 2014-10-04 02:19:27

+0

ViewWillAppear似乎不可用作可覆盖的方法。 ViewDidAppear也不是。有任何想法吗? – 2014-10-15 23:55:17

有一两件事你可以尝试是保持你的登录页NavigationPage的里面,然后而不是运行在登录页面内PopAsync()他们已经成功登录后,只需用旧的导航页面替换MainPage

在你的App类:

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; 
    } 
} 

否则,我也做了自定义渲染为NavigationRenderer iOS上插入工具栏项目上的导航栏的右侧,并已覆盖了一些Menu相关Android上的东西来改变图标的​​文字/颜色。