我的应用有一个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 type,System.String propertyName)[0x0000d] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ ResourceManager.cs:76 在Xamarin.Forms.Platform.Android.ResourceManager.IdFromTitle (System.String标题,System.Type类型)[0x00007] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ ResourceManager.cs:70 在Xamarin.Forms.Platform.Android.ResourceManager.GetDrawable (Android.Content.Res.Resources资源,System.String名称)[0x00000] 在 C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ ResourceManager.cs:42 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.UpdateMenu ()[0x000f7] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ NavigationPageRenderer.cs:747 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.ToolbarTrackerOnCollectionChanged (System.Object sender,System.EventArgs eventArgs)[0x00000] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ NavigationPageRenderer.cs:715 在Xamarin.Forms.Internals.ToolbarTracker.EmitCollectionChanged() [0x00008] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \内幕\ ToolbarTracker.cs:60 在Xamarin.Forms.Internals.ToolbarTracker.set_Target (Xamarin.Forms.Page value)[0x00031] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \内幕\ ToolbarTracker.cs:37 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs
1[TElement] e) [0x000f2] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:258 at Xamarin.Forms.Platform.Android.VisualElementRenderer
1 [TElement] .SetElement (元素元素)[0x000f4] in C:\ BuildAgent3 \工作\ 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] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ VisualElementRenderer.cs:137 在Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement元素)[0x0001f] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ Platform.cs:289 在Xamarin.Forms.Platform.Android.AppCompat.Platform.AddChild (Xamarin.Forms.Page页面,System.Boolean布局)[0x00015] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ Platform.cs:250 在Xamarin.Forms.Platform.Android.AppCompat.Platform.SetPage (Xamarin.Forms.Page newRoot)[0x00089] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ Platform.cs:239 在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.InternalSetPage (Xamarin.Forms.Page页面)[0x0001a] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ FormsAppCompatActivity.cs:370 在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.AppOnPropertyChanged (System.Object sender,System.ComponentModel.PropertyChangedEventArgs args)[0x00012] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ FormsAppCompatActivity.cs:321 在Xamarin.Forms.BindableObject.OnPropertyChanged(System.String propertyName)[0x0000a] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs:136 在Xamarin.Forms.Element.OnPropertyChanged(System.String propertyName)[0x00000] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Element.cs:380 在Xamarin.Forms.Application.set_MainPage(Xamarin.Forms.Page值) [0x0008b] in C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Application.cs:90 在Intertain.Mobile.Custom.CustomMvxFormsPagePresenter.TryShowPage [T] (MvvmCross.Core.ViewModels.MvxViewModelRequest请求)[0x0005c] in D:\ Visual Studio \ My 项目\ Intertain \手机\ Intertain.Mobile \ Intertain.Mobile \自定义\ 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>
尝试将图标值设置为&#34; Refresh.png&#34;,&#34; refresh.png&#34;,&#34;刷新&#34;和&#34;刷新&#34;,使用名为Refresh.png的图像或者drawable文件夹中的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>
页面加载得很好,没有问题,我看到文字&#34;刷新&#34;当然没有图标。
因此,我确信问题在于它没有找到图像,但我无法找到如何让它找到它。
图像设置为AndroidResource,但我确实尝试过EmbeddedResource和None ...
我在这里做错了什么?
编辑:史蒂夫激励我尝试使用转换器绑定资源,所以我掀起了这个: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上留下文字而不是图标,因为有一个糟糕的用户界面比有一个破坏的用户界面更好,并且将它粉碎到xamarin表格仍然很糟糕,我需要继续寿命。
如果你有任何想法,我可以再试一次游戏,但是我通过黑客攻击这个。
答案 0 :(得分:0)
您是否尝试过从代码中添加项目?
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文件夹并重建项目!
答案 1 :(得分:0)
我就是这样做的:
查看
<ContentPage.ToolbarItems>
<ToolbarItem Icon="{Binding AddIcon}" Command="{Binding AddCommand}" />
</ContentPage.ToolbarItems>
查看模型
public ImageSource AddIcon => "ic_add.png";
该图标位于Resources \ drawable \ ic_add.png中,并具有AndroidResource的构建操作。
确保视图模型中的文件名和名称均为小写。