繁体   English   中英

Xamarin.forms 嵌入图像未在 iOS 上显示

[英]Xamarin.forms embedded image not shown on iOS

我正在使用 xamarin.forms 构建一个应用程序。 由于图像要在两种设备上显示,我选择使用嵌入图像并遵循教程。

我的图像的构建动作被配置为 EmbeddedRessource

在此处输入图片说明

我创建了自定义类:

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 广告(我遵循了教程)。 但在Android上似乎不是问题。

我以编程方式设置图像的资源:

ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png");

问题是我的图像从未显示在 iOS 上,无法弄清楚原因。

[编辑] 关于我如何设置源的精确度

加载图像的页面称为PianoTrainingPage所以我有一个名为PianoTrainingPage的类。 显示的图像应根据是否检测到和弦而改变,并调用一个函数来加载正确的图像。 但是因为没有显示图像,我只在该函数中以编程方式设置了一个图像以进行测试。

我测试了几次对ImageRessource.FromRessource调用,但没有一个主题解决了我的问题:

  • 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 错误的类)--> 图像显示在 Android 上,但不在 ios 上
  • ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png"); (第二个参数使用默认值) --> 图像在Android上显示但在ios上不显示

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

正如 Jason 和 ToolmakerSteve 在评论中提到的,有两种方法可以解决这个问题。

xml

为您的命名空间添加另一个name ,允许添加具有不同名称的相同命名空间。

xmlns:a="clr-namespace:PianoTraining"
xmlns:b="clr-namespace:PianoTraining"
xmlns:c="clr-namespace:PianoTraining"

然后设置对类ImageResourceExtension的引用,比如

<Image Source="{a:ImageResource PianoTraining.assets.images.wrongChord.png}" />

背后的代码

只需提供包含在当前程序集中的任何类,如ImageResourceExtension

ChordStatusImage.Source = ImageSource.FromResource("PianoTraining.assets.images.wrongChord.png",typeof(ImageResourceExtension ).GetTypeInfo().Assembly);

事实证明,我从一开始就做得很好,使用typeof值,但由于某种原因,我的 mac 麦克风的数据没有提供给 ios 模拟器。 我重新编译了我的绑定库,现在一切正常。

感谢您的帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM