【发布时间】: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