【问题标题】:ToolbarItem Icon stopped workingToolbarItem 图标停止工作
【发布时间】:2017-08-08 20:43:43
【问题描述】:

我的应用定义了一个 ToolbarItem,其图标如下:

<ContentPage.ToolbarItems>
    <ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Icon="Refresh.png" Priority="0" Command="{Binding RefreshCommand}" />
</ContentPage.ToolbarItems>

图像位于 Resources/drawable/Refresh.png 中,此 XAML 在 Xamarin Forms 2.3.4.247 中运行良好。

突然之间,在同一版本 2.3.4.247 上,同样的 XAML 因空引用异常而失败:

{System.NullReferenceException:对象引用未设置为 对象的实例。在 Xamarin.Forms.Platform.Android.ResourceManager.GetId (System.Type 类型,System.String propertyName) [0x0000d] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\ResourceManager.cs:76 在 Xamarin.Forms.Platform.Android.ResourceManager.IdFromTitle (System.String 标题,System.Type 类型)[0x00007] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\ResourceManager.cs:70 在 Xamarin.Forms.Platform.Android.ResourceManager.GetDrawable (Android.Content.Res.Resources 资源,System.String 名称)[0x00000] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\ResourceManager.cs:42 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.UpdateMenu () [0x000f7] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:747 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.ToolbarTrackerOnCollectionChanged (System.Object 发送者,System.EventArgs eventArgs)[0x00000] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:715 在 Xamarin.Forms.Internals.ToolbarTracker.EmitCollectionChanged () [0x00008] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Internals\ToolbarTracker.cs:60 在 Xamarin.Forms.Internals.ToolbarTracker.set_Target (Xamarin.Forms.Page 值)[0x00031] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Internals\ToolbarTracker.cs:37 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs1[TElement] e) [0x000f2] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:258 at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetElement (TElement 元素)[0x000f4] 中 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:196 在 Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement 元素)[0x00027] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:137 在 Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement 元素)[0x0001f] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\Platform.cs:289 在 Xamarin.Forms.Platform.Android.AppCompat.Platform.AddChild (Xamarin.Forms.Page 页面,System.Boolean 布局)[0x00015] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:250 在 Xamarin.Forms.Platform.Android.AppCompat.Platform.SetPage (Xamarin.Forms.Page newRoot) [0x00089] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:239 在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.InternalSetPage (Xamarin.Forms.Page 页面)[0x0001a] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\FormsAppCompatActivity.cs:370 在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.AppOnPropertyChanged (System.Object 发送者,System.ComponentModel.PropertyChangedEventArgs args) [0x00012] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\FormsAppCompatActivity.cs:321 在 Xamarin.Forms.BindableObject.OnPropertyChanged (System.String propertyName) [0x0000a] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:136 在 Xamarin.Forms.Element.OnPropertyChanged (System.String propertyName) [0x00000] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Element.cs:380 在 Xamarin.Forms.Application.set_MainPage (Xamarin.Forms.Page 值) [0x0008b] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Application.cs:90 在 Intertain.Mobile.Custom.CustomMvxFormsPagePresenter.TryShowPage[T] (MvvmCross.Core.ViewModels.MvxViewModelRequest 请求)[0x0005c] 在 D:\Visual Studio\我的 Projects\Intertain\Mobile\Intertain.Mobile\Intertain.Mobile\Custom\CustomMvxFormsPagePresenter.cs:76 }

研究问题时,我发现我应该使用小写的资源名称,我试图修复它,但无论我做什么,我仍然得到同样的错误。

我尝试将 XAML 更改为 OnPlatform:

<ContentPage.ToolbarItems>
    <ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Priority="0" Command="{Binding RefreshCommand}">
        <ToolbarItem.Icon>
            <OnPlatform x:TypeArguments="FileImageSource" Android="refresh.png" WinPhone="refresh.png" />
        </ToolbarItem.Icon>
    </ToolbarItem>
</ContentPage.ToolbarItems>

尝试将 Icon 值设为“Refresh.png”、“refresh.png”、“refresh”和“Refresh”,在可绘制文件夹中使用名为 Refresh.png 或 refresh.png 的图像给我同样的结果错误。

如果我在 android 上将 Icon 属性设置为空白:

<ContentPage.ToolbarItems>
    <ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Priority="0" Command="{Binding RefreshCommand}">
        <ToolbarItem.Icon>
            <OnPlatform x:TypeArguments="FileImageSource" Android="" WinPhone="refresh.png" />
        </ToolbarItem.Icon>
    </ToolbarItem>
</ContentPage.ToolbarItems>

页面加载正常,没有问题,我看到文本“刷新”,当然没有图标。

所以我确信问题在于它没有找到图像,但我终其一生都无法弄清楚如何让它找到它。

图像设置为 AndroidResource,但我确实尝试了 EmbeddedResource 和 None...

我到底做错了什么?

编辑:Steve 启发我尝试使用转换器绑定到资源,所以我做了这个:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var source= ImageSource.FromFile(parameter.ToString());
    return source;
}

我传入一个虚拟绑定和参数来创建源:

<ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Icon="{Binding IsLoading, Converter={StaticResource IconSourceConverter}, ConverterParameter=refresh.png}" Priority="0" Command="{Binding RefreshCommand}" />

它被实例化了(我从转换器返回的源值没有得到空引用错误)

但是在我退货后,我得到了同样愚蠢的错误。

我正式放弃了,我只想在 android 上留下文字而不是图标,因为有一个糟糕的 UI 比有一个坏掉的 UI 更好,并且把它归结为 xamarin 形式仍然很糟糕,我需要继续生活。

如果你有任何想法,我可以再试一次,但我已经通过黑客攻击了。

【问题讨论】:

  • 尝试更新表单。上一个版本已经是 2.3.4.247 你有点落后了:-)
  • 哎呀,我看错了包。事实证明我在 2.3.4.247,并且正在运行的版本也在同一版本上。我正在更新帖子以说明这一点,对于我的困惑感到抱歉
  • 您能否提供一个示例项目,我们/将看看我们是否可以重新创建并可能解决问题?它必须很简单,因为它适用于我的项目
  • 我会看看我是否可以在一个空白项目中重新创建它,但我不抱希望,因为就像我提到的出于某种原因,同一个项目的旧版本可以正常工作。我认为这是 android appcompat 的 nuget 包,但降级以匹配工作版本也不起作用。但是,是的,这个周末我会挖掘更多,如果我能得到一个样品,我会回来报告,谢谢!

标签: android xamarin.forms android-resources


【解决方案1】:

您是否尝试过从后面的代码中添加项目?

var searchToolbarItem = new ToolbarItem { Icon = AssetNames.SearchIcon };
ToolbarItems.Add(searchToolbarItem);
searchToolbarItem.SetBinding(MenuItem.CommandProperty, nameof(BookPageViewModel.OpenAppointmentsSearchCommand));

AssetNames.SearchIcon 是:

public const string SearchIcon = "ic_search_white.png";

我还注意到您将 Xamarin.Forms 更新为 1.2?该软件包版本是 2014 年 7 月的。

如果是这种情况,请尝试以下操作: Xamarin.Forms 2.3.4.247

同时删除 bin/obj 文件夹并重建项目!

【讨论】:

  • 我会试一试,但现在我发现它们都在同一个版本的表单上(更新了原始帖子,我正在查看错误的包)我要做对两者进行完全差异,看看我是否能发现差异。会报告的,谢谢!
  • 尽可能避免在后面的代码中做任何事情。
【解决方案2】:

这就是我的做法:

查看

<ContentPage.ToolbarItems>
    <ToolbarItem Icon="{Binding AddIcon}" Command="{Binding AddCommand}" />
</ContentPage.ToolbarItems>

查看模型

public ImageSource AddIcon => "ic_add.png";

图标在 Resources\drawable\ic_add.png 中,并且有一个 AndroidResource 的构建动作。

确保文件名和视图模型中的名称都是小写的。

【讨论】:

  • 这是一个有趣的想法,但我不能把它放在我的视图模型中,因为 VM 不在同一个库中,所以我不能在其中引用 Xamarin Forms 对象。但它确实给了我尝试通过转换器创建绑定的想法......这也不起作用(我怀疑如果我可以尝试你的建议,我也会得到相同的结果)。我现在放弃了,只显示文本而不是图标,但感谢您的输入!
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多