Проблема с настраиваемым средством визуализации и добавлением значков в ToolbarItems / NavigationItem с помощью Xamarin Forms

TL; DR: при добавлении свойства значка в ToolbarItem настраиваемое средство визуализации не работает. Заголовок NavigationController.TopViewController.NavigationItem в этом случае не установлен.

Я работаю над реализацией нового приложения с использованием 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>

рендерер больше не работает. Я сузил проблему до того момента, когда свойство Icon присутствует, nativeItem.Title имеет значение null и не установлено в NavigationController.TopViewController.NavigationItem. Это приведет к тому, что мое приложение выдаст ошибку.

Я считаю, что это ошибка в коде Xamarin, поэтому я ищу возможное решение или какие-либо исправления для этой проблемы. Я использую текущие версии Xamarin и Xamairn.forms.


person Jared Reeves    schedule 02.09.2014    source источник
comment
похоже на вопрос поддержки xamarin   -  person Sten Petrov    schedule 03.09.2014
comment
Я уже обращался в службу поддержки Xamarin, я просто надеялся, что кто-то еще столкнулся с проблемой и нашел исправление.   -  person Jared Reeves    schedule 03.09.2014
comment
в XF еще много шероховатостей, надеюсь, они скоро исправят это. дайте нам знать, если есть решение   -  person Sten Petrov    schedule 03.09.2014
comment
Это была ошибка в базе кода Xamarin. Средство отслеживания ошибок для этой проблемы: bugzilla.xamarin.com/show_bug.cgi?id=22621 < / а>   -  person Jared Reeves    schedule 04.09.2014


Ответы (1)


В качестве обходного пути к этой проблеме вы можете указать несколько действительно уродливых ToolbarItem.Name, которые содержат желаемое имя и текст значка (если вы не знаете заранее имя файла значка), а затем вы можете разделить Name в настраиваемом средстве визуализации и назначить ваш значок там.

В SecondView ваш Name может стать:

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

Затем в настраиваемом средстве визуализации вы можете просто сделать ToolbarItem.Name.Split('_'), чтобы получить значение значка и вместо этого назначить значок в средстве визуализации.

person hvaughan3    schedule 02.02.2016