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



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

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

最新更新