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

时间:2014-10-01 00:53:29

标签: xamarin xamarin.forms

我的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

2 个答案:

答案 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),因此我不知道它是否与您的应用程序相关。

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