【问题标题】:Showing different toolbar buttons on each page with Xamarin Forms使用 Xamarin Forms 在每个页面上显示不同的工具栏按钮
【发布时间】:2014-10-01 00:53:28
【问题描述】:

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

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    您可以尝试的一件事是将您的登录页面保留在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;
        }
    }
    

    否则,我还在 iOS 上为 NavigationRenderer 制作了一个自定义渲染器,以将工具栏项插入到导航栏的右侧,并在 Android 上覆盖了一些与 Menu 相关的内容以更改图标文本/颜色。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 听起来很有趣。将进行调查。
      • 如果您在实施方面需要更多帮助,请告诉我。
      • ViewWillAppear 似乎不能用作可覆盖的方法。 ViewDidAppear 也不是。有什么想法吗?
      • @SteveChadbourne 你在扩展什么渲染器
      • 我猜这是在 iOS 上。我在安卓上。我正在扩展 PageRenderer。
      猜你喜欢
      • 2014-09-14
      • 2019-02-10
      • 1970-01-01
      • 2014-09-13
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2014-05-02
      相关资源
      最近更新 更多