Xamarin.forms iOS 上未显示嵌入图像
Xamarin.forms embedded image not shown on iOS
我正在使用 xamarin.forms 构建应用程序。因为图像要在两个设备上显示,所以我选择使用嵌入图像并遵循 this 教程。
我的图像的构建操作配置为 EmbeddedRessource
我创建了自定义 class :
using System;
using System.Reflection;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace PianoTraining
{
[ContentProperty(nameof(Source))]
public class ImageResourceExtension : IMarkupExtension
{
public string Source { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
if (Source == null)
return null;
return ImageSource.FromResource(Source, typeof(ImageResourceExtension).GetTypeInfo().Assembly);
}
}
}
然后我通过 XAML:
加载我的图片
<Image x:Name="ChordStatusImage" AbsoluteLayout.LayoutBounds="0.66,0.33" AbsoluteLayout.LayoutFlags="XProportional,YProportional" />
唯一略有不同的是 xmlns 步骤:我无法按照教程中的说明设置 xmlns 属性,因为我已经将其设置为另一个值以使用自定义渲染器在其中显示 AdMob 广告我的应用程序(我遵循了 this 教程)。但是在Android.
上好像没有问题
我以编程方式设置图像资源:
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png");
问题是我的图片从未在 iOS 上显示过,也不知道为什么。
[编辑]
关于我如何设置源的精确度
加载图像的页面称为 PianoTrainingPage
所以我有一个 class 称为 PianoTrainingPage
。显示的图像应该根据是否检测到和弦而改变,并调用一个函数来加载正确的图像。但是因为没有显示图像,我只在该函数中以编程方式设置了一张图像用于测试目的。
我测试了几次调用 ImageRessource.FromRessource
和 none 的主题解决了我的问题:
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png",typeof(ImageResourceExtension).GetTypeInfo().Assembly);
(教程中的那个)-->图像在Andrid上显示但在ios 上不显示
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png",typeof(PianoTrainingPage).GetTypeInfo().Assembly);
(因为我想可能我给 typeof 的 class 错了)--> 图片显示在 Android 而不是 ios
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png");
(第二个参数使用默认值)-->图像在Android上显示但在ios 上不显示
在我的代码中,我使用了第三个版本,因为它是我测试的最后一个
正如 Jason 和 ToolmakerSteve 在评论中提到的,有两种方法可以解决问题。
Xaml
为您的命名空间添加另一个 name
,允许添加具有不同名称的相同命名空间。
xmlns:a="clr-namespace:PianoTraining"
xmlns:b="clr-namespace:PianoTraining"
xmlns:c="clr-namespace:PianoTraining"
然后设置对 class ImageResourceExtension
的引用,比如
<Image Source="{a:ImageResource PianoTraining.assets.images.wrongChord.png}" />
代码隐藏
只需提供当前程序集中包含的任何 class,例如 ImageResourceExtension
。
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png",typeof(ImageResourceExtension ).GetTypeInfo().Assembly);
原来我从一开始就做的很好,有typeof
的价值,但是不知为什么,我mac的麦克风数据没有提供给ios模拟器。我重新编译了我的绑定库,现在一切正常了。
感谢您的帮助
我正在使用 xamarin.forms 构建应用程序。因为图像要在两个设备上显示,所以我选择使用嵌入图像并遵循 this 教程。
我的图像的构建操作配置为 EmbeddedRessource
我创建了自定义 class :
using System;
using System.Reflection;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace PianoTraining
{
[ContentProperty(nameof(Source))]
public class ImageResourceExtension : IMarkupExtension
{
public string Source { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
if (Source == null)
return null;
return ImageSource.FromResource(Source, typeof(ImageResourceExtension).GetTypeInfo().Assembly);
}
}
}
然后我通过 XAML:
加载我的图片<Image x:Name="ChordStatusImage" AbsoluteLayout.LayoutBounds="0.66,0.33" AbsoluteLayout.LayoutFlags="XProportional,YProportional" />
唯一略有不同的是 xmlns 步骤:我无法按照教程中的说明设置 xmlns 属性,因为我已经将其设置为另一个值以使用自定义渲染器在其中显示 AdMob 广告我的应用程序(我遵循了 this 教程)。但是在Android.
上好像没有问题我以编程方式设置图像资源:
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png");
问题是我的图片从未在 iOS 上显示过,也不知道为什么。
[编辑] 关于我如何设置源的精确度
加载图像的页面称为 PianoTrainingPage
所以我有一个 class 称为 PianoTrainingPage
。显示的图像应该根据是否检测到和弦而改变,并调用一个函数来加载正确的图像。但是因为没有显示图像,我只在该函数中以编程方式设置了一张图像用于测试目的。
我测试了几次调用 ImageRessource.FromRessource
和 none 的主题解决了我的问题:
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png",typeof(ImageResourceExtension).GetTypeInfo().Assembly);
(教程中的那个)-->图像在Andrid上显示但在ios 上不显示
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png",typeof(PianoTrainingPage).GetTypeInfo().Assembly);
(因为我想可能我给 typeof 的 class 错了)--> 图片显示在 Android 而不是 iosChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png");
(第二个参数使用默认值)-->图像在Android上显示但在ios 上不显示
在我的代码中,我使用了第三个版本,因为它是我测试的最后一个
正如 Jason 和 ToolmakerSteve 在评论中提到的,有两种方法可以解决问题。
Xaml
为您的命名空间添加另一个 name
,允许添加具有不同名称的相同命名空间。
xmlns:a="clr-namespace:PianoTraining"
xmlns:b="clr-namespace:PianoTraining"
xmlns:c="clr-namespace:PianoTraining"
然后设置对 class ImageResourceExtension
的引用,比如
<Image Source="{a:ImageResource PianoTraining.assets.images.wrongChord.png}" />
代码隐藏
只需提供当前程序集中包含的任何 class,例如 ImageResourceExtension
。
ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png",typeof(ImageResourceExtension ).GetTypeInfo().Assembly);
原来我从一开始就做的很好,有typeof
的价值,但是不知为什么,我mac的麦克风数据没有提供给ios模拟器。我重新编译了我的绑定库,现在一切正常了。
感谢您的帮助