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 的主题解决了我的问题:

在我的代码中,我使用了第三个版本,因为它是我测试的最后一个

正如 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模拟器。我重新编译了我的绑定库,现在一切正常了。

感谢您的帮助