TLDR:向 ToolbarItem 添加图标属性时,自定义渲染器不起作用。在这种情况下未设置 NavigationController.TopViewController.NavigationItem 标题
我正在努力使用 Xamarin Forms 实现一个新应用程序,但遇到了一个无法解决的问题。首先,我尝试为此应用程序构建一个自定义 iOS 导航工具栏,我想向 leftBarItems 添加一些项目并删除其他项目。此自定义导航栏将出现在除 masterDetailPage(第一个 View )之外的所有页面上。我已经使大部分功能正常工作,但是如果我将 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();
}
}
}
我对某些 View 使用 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。
最佳答案
作为解决此问题的方法,您可以提供一些非常丑陋的 ToolbarItem.Name
,其中包含所需的名称和图标文本(如果您提前不知道图标文件名)然后您可以在自定义渲染器中拆分名称
并在那里分配您的图标。
在 SecondView 中,您的名称
可能会变成:
<ToolbarItem Name="Menu_icon.png" Command="{Binding NavigateMenuCommand}"
Order="Primary" Priority="0" Icon="" />
}
然后在自定义渲染器中,您只需执行 ToolbarItem.Name.Split('_')
即可获取图标值并在渲染器中分配图标。
关于ios - 自定义渲染器以及使用 Xamarin Forms 将图标添加到 ToolbarItems/NavigationItem 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25628127/