首页 > 解决方案 > 如何从 XAML 引用具有不同文件扩展名的图像?

问题描述

我们开发了一个 Xamarin.Forms UI 库,其中图像存储为 Android 的 PNG 和 iOS 的 PDF。对于 Android,图像位于 Resources 文件夹中,对于 iOS,图像位于资产目录中。iOS 和 Android 之间每个图像的文件名相同,但文件扩展名不同。

使用检查 Assets.carxcrun --sdk iphoneos assetutil --info Assets.car显示图像存储为 PDF,并且在构建时未转换为 PNG。

...
{
  "AssetType" : "Image",
  "BitsPerComponent" : 8,
  "ColorModel" : "RGB",
  "Colorspace" : "srgb",
  "Compression" : "deepmap2",
  "Encoding" : "ARGB",
  "Image Type" : "kCoreThemeOnePartScale",
  "Name" : "ic_cup_coffee",
  "NameIdentifier" : 54350,
  "Opaque" : false,
  "PixelHeight" : 24,
  "PixelWidth" : 24,
  "RenditionName" : "ic_cup_coffee.pdf",
  "Scale" : 1,
  "SHA1Digest" : "0999A4B02703DF4A5FC84AF67FEF220E560F79DD",
  "SizeOnDisk" : 334,
  "Template Mode" : "automatic"
}
...

为了从 XAML 中引用图像,我们有一个帮助类,它将类字段映射到文件名(不包括文件扩展名):

public static class Images
{
    public static readonly string Ic_cup_coffee = "ic_cup_coffee"; // value equals file name
    ...
}

在 XAML 中,我们使用 x:Static 标记扩展:

<Image Source="{x:Static images:Images.Ic_cup_coffee}" />

我们使用这种方法遇到的问题是,有时图像不会显示在将 Xamarin.Forms UI 库集成为 NuGet 包的 iOS 应用程序中。在 Android 上,我们不会遇到任何问题。

文档说明了如何跨不同平台使用单个图像文件,但没有说明如何处理用于同一图像源的具有不同文件扩展名的文件。

如何正确引用具有不同文件扩展名的 XAML 图像?我们参考图像的方法是否有效?

标签: iosxamlxamarinxamarin.formsxamarin.ios

解决方案


可以从 XAML 引用具有不同文件扩展名的图像,如下所示:

<Image>
  <Image.Source>
    <OnPlatform x:TypeArguments="ImageSource">
        <OnPlatform.iOS><FileImageSource File="ic_cup_coffee.pdf"/></OnPlatform.iOS>
        <OnPlatform.Android><FileImageSource File="ic_cup_coffee.png"/></OnPlatform.Android>
    </OnPlatform>
  </Image.Source>
</Image>

无论如何,这并不能解决我们的图像有时不可见的问题。我们坚持使用<Image Source="ic_cup_coffee"/>,我们将分析这个错误是否是问题的根源。


推荐阅读