【问题标题】:Issue with custom renderer and adding icons to ToolbarItems/NavigationItem with Xamarin Forms自定义渲染器出现问题并将图标添加到 ToolbarItems/NavigationItem 与 Xamarin Forms
【发布时间】:2014-10-26 23:57:36
【问题描述】:

TLDR:向 ToolbarItem 添加图标属性时,自定义渲染器不起作用。在这种情况下没有设置 NavigationController.TopViewController.NavigationItem Title

我正在使用 Xamarin Forms 实现一个新应用程序,但遇到了一个无法解决的问题。首先,我正在尝试为这个应用程序构建一个自定义 iOS 导航工具栏,我想将一些项目添加到 leftBarItems 并删除其他项目。此自定义导航栏将出现在除 masterDetailPage(第一个视图)之外的所有页面上。我已经使大部分功能正常工作,但是如果我将 Icon 属性添加到 ToolBarItem,我的自定义渲染器会中断。这是渲染器:

[assembly:ExportRenderer(typeof(SecondView),typeof(MainViewModelPageRenderer))]

namespace XLabsTest.iOS
{
   class MainViewModelPageRenderer : PageRenderer
   {                
      public override void ViewWillAppear(bool animated)
      {
         base.ViewWillAppear(animated);

         var itemsInfo = (this.Element as ContentPage).ToolbarItems;

         var navigationItem = 
                this.NavigationController.TopViewController.NavigationItem;
         var leftNativeButtons = (navigationItem.LeftBarButtonItems 
                                 ?? new UIBarButtonItem[] { }).ToList();
         var rightNativeButtons = (navigationItem.RightBarButtonItems 
                                 ?? new UIBarButtonItem[] { }).ToList();
         var tempNativeButtons = (new UIBarButtonItem[] {}).ToList() ;
         rightNativeButtons.ForEach(nativeItem =>
         {
            if (nativeItem.Title != "ItemSetinDetailsPage")
            {    
               var info = GetButtonInfo(itemsInfo, nativeItem.Title);

               if (info.Priority == 0)
               {
                  tempNativeButtons.Add(nativeItem);
                  leftNativeButtons.Add(nativeItem);
               }
            }
          });

          tempNativeButtons.ForEach(nativeItem =>
          {
              rightNativeButtons.Remove(nativeItem);
          });

          navigationItem.RightBarButtonItems = rightNativeButtons.ToArray();
          navigationItem.LeftBarButtonItems = leftNativeButtons.ToArray();
      }

      private ToolbarItem GetButtonInfo(IList<ToolbarItem> items, string name)
      {
          if (string.IsNullOrEmpty(name) || items == null)
              return null;
          return items.ToList()
                      .Where(itemData => name.Equals(itemData.Name))
                      .FirstOrDefault();
     }
  }
}

我在某些视图中使用 xaml,这是添加项目的代码:

<ContentPage.ToolbarItems>
  <ToolbarItem Name="Menu" Command="{Binding NavigateMenuCommand}" 
        Order="Primary" Priority="0"/>
  <ToolbarItem Name="Back" Command="{Binding NavigateBackCommand}" 
        Order="Primary" Priority="0" />
</ContentPage.ToolbarItems>

上面的代码可以正常工作,但是如果我添加这个:

<ContentPage.ToolbarItems>
   <ToolbarItem Name="Menu" Command="{Binding NavigateMenuCommand}" 
        Order="Primary" Priority="0" Icon="icon.png" />
   <ToolbarItem Name="Back" Command="{Binding NavigateBackCommand}" 
        Order="Primary" Priority="0" />
</ContentPage.ToolbarItems>

渲染器不再工作。我已将问题范围缩小到存在图标属性时,nativeItem.Title 为空且未在 NavigationController.TopViewController.NavigationItem 中设置。这将导致我的应用程序抛出错误。

我认为这是 Xamarin 代码中的错误,因此我正在寻找可能的解决方法或任何修复此问题的方法。我正在使用当前版本的 Xamarin 和 Xamairn.forms。

【问题讨论】:

  • 看起来像一个 xamarin 支持问题
  • 我已经联系了 Xamarin 支持,我只是希望其他人遇到了这个问题并找到了解决方法。
  • XF 中仍有很多粗糙的边缘,我希望他们尽快清理掉。让我们知道是否有解决方案
  • 这是 Xamarin 代码库中的一个错误。此问题的错误跟踪器:bugzilla.xamarin.com/show_bug.cgi?id=22621

标签: ios xaml xamarin.ios xamarin xamarin.forms


【解决方案1】:

作为解决此问题的方法,您可以提供一些非常丑陋的 ToolbarItem.Names,其中包含所需的名称和图标文本(如果您不知道图标文件名提前),然后您可以拆分 @ 987654322@ 在自定义渲染器中并在那里分配您的图标。

在 SecondView 中,您的 Name 可能变为:

<ToolbarItem Name="Menu_icon.png" Command="{Binding NavigateMenuCommand}" 
    Order="Primary" Priority="0" Icon="" />
}

然后在自定义渲染器中,您只需执行ToolbarItem.Name.Split('_') 即可获取图标值并在渲染器中分配图标。

【讨论】:

    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 2018-07-29
    • 2021-04-04
    • 2018-01-04
    • 2016-09-03
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多