2014-09-02 22 views
1

TLDR:将图标属性添加到ToolbarItem时,自定义渲染器不起作用。在这种情况下,NavigationController.TopViewController.NavigationItem标题未设置为使用自定义渲染器并将图标添加到ToolbarItems/NavigationItem并使用Xamarin Forms添加图标

我正在使用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。

+0

看起来像一个Xamarin支持问题 – 2014-09-03 14:04:31

+1

我已经联系了Xamarin的支持,我只是希望别人遇到了这个问题,并找到了解决办法。 – 2014-09-03 14:07:00

+1

XF中仍然有很多粗糙的边缘,我希望他们很快清理它。让我们知道是否有解决方案 – 2014-09-03 17:48:06

回答

1

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

在SecondView您Name可能变成:

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

然后在自定义渲染你可以做ToolbarItem.Name.Split('_')拿到图标值,并指定在渲染器的图标来代替。

相关问题