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.