【问题标题】:Xamarin.forms embedded image not shown on iOSXamarin.forms 嵌入图像未在 iOS 上显示
【发布时间】:2021-12-11 01:49:42
【问题描述】:

我正在使用 xamarin.forms 构建应用程序。因为图像要在两个设备上显示,所以我选择使用嵌入图像并遵循this 教程。

我的图片的构建动作配置为 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 广告(我遵循 @ 987654323@教程)。但这在 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上不显示

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

【问题讨论】:

  • 如果您在代码中设置图像源,则不需要 XAML 扩展和标记。而你设置ChordStatusImage.Source 的最后一个代码sn-p 看起来与教程中显示的完全不同。您没有提供对图像所在的共享程序集的引用。
  • AbsoluteLayout 我认为有 4 个数字,位置与高度。称为 Layoutbounds xamgirl.com/absolutelayout-in-xamarin-made-simple
  • @BasH 最后两个数字是可选的,如果没有提供它们的值是AutoSize
  • 你没有按照我说的去做。 ImageSource.FromResource("somename"); 将从默认的 iOS/Android 图像位置加载图像。如果要从 shared Forms 程序集加载,则必须包含对该程序集的引用。请参阅您链接到的教程中的示例:ImageSource.FromResource("WorkingWithImages.beach.jpg", typeof(MyClass).GetTypeInfo().Assembly)
  • 我不知道,因为您没有发布该代码。您发布了一堆您实际上并未使用的标记扩展的代码。请发布正确的相关代码。还要验证您使用的是正确的 ResourceID,如教程中所示

标签: c# xamarin xamarin.forms xamarin.ios


【解决方案1】:

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

Xaml

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

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

然后设置类ImageResourceExtension 的引用,like

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

后面的代码

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

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

【讨论】:

    【解决方案2】:

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

    感谢您的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多