在运行时为 xaml .Net 2.0 多平台移动开发分配图像资源

Assigning image resource during runtime for xaml .Net 2.0 multi platform mobile development

目标:

我想用这样的图像显示一个 ImageButton:

当前的解决方案有效,但我只能选择将单个图像硬编码到 xaml。

为此我已经准备了很多东西:

现状

  1. 我添加了图像并将其设置为“构建操作:嵌入式资源”

  2. 我已经按照网上的建议添加了 ImageResourceExtension 以便在 xaml:

    中使用
using System;
using System.Reflection;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Bitconomy.resources
{
    [ContentProperty(nameof(Source))]
    public class ImageResourceExtension : IMarkupExtension
    {
        public string Source { get; set; }

        public object ProvideValue(IServiceProvider serviceProvider)
        {
            if (Source == null)
            {
                return null;
            }

            // Do your translation lookup here, using whatever method you require
            var imageSource = ImageSource.FromResource(Source, typeof(ImageResourceExtension).GetTypeInfo().Assembly);

            return imageSource;
        }
    }
}
  1. 我在 xaml 中添加了对 ImageResourceExtension/resources 的引用:
xmlns:resources="clr-namespace:Bitconomy.resources"
  1. 我已将图像资源添加到 ImageButton:
<ImageButton x:Name="MiningButton" Grid.Row="0" Source="{resources:ImageResource Bitconomy.resources.images.mines.stone_mine.jpg}" ></ImageButton>

结果是顶部“目标”部分下显示的结果。目前还好。

问题

我想在旅途中设置地雷。我准备了一个“mining_view.xaml”。在“mining_view.xaml.cs”中,我添加了配置地雷的代码,例如。用于石头、铁或任何东西。我想为每个地雷设置不同的图像。

我过去在堆栈溢出时遇到过类似的问题,但它是针对桌面使用的。毕竟移动开发有多么不同,我感到很震惊。相似但不相同。

如果你能帮我弄清楚如何在代码中设置图像源以便它在 android 和 ios 中工作,我将非常高兴。

public void ConfigureMine(string ItemType)
{
    this.MiningButton.Source = new ImageSource.FromResource("resources:ImageResource Bitconomy.resources.images.mines.stone_mine.jpg");
    // or sth like that?
    this.MiningButton.Source = resources.ImageResourceExtension.ProvideValue(SomeProvider?)
}
  1. 在 xaml 中创建图像。将 x:Name 属性 分配给 select 来自代码的图像:
<Image x:Name="Mine_Image" Grid.Column="0" Grid.Row="0" Aspect="AspectFill"></Image>
  1. 您将需要资源扩展:
using System;
using System.Reflection;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Bitconomy.resources
{
    [ContentProperty(nameof(Source))]
    public class ImageResourceExtension : IMarkupExtension
    {
        public string Source { get; set; }

        public object ProvideValue(IServiceProvider serviceProvider)
        {
            if (Source == null)
            {
                return null;
            }

            // Do your translation lookup here, using whatever method you require
            var imageSource = ImageSource.FromResource(Source, typeof(ImageResourceExtension).GetTypeInfo().Assembly);

            return imageSource;
        }
        public ImageSource GetImageSource(string resourcepath)
        {
            return ImageSource.FromResource(resourcepath, typeof(ImageResourceExtension).GetTypeInfo().Assembly);
        }
    }
}
  1. 添加资源图片

  2. 将图像设置为构建操作“嵌入式资源”

  3. 在form.xaml.cs内更改图片(根据需要调整资源路径):

this.Mine_Image.Source = Resources.GetImageSource("Bitconomy.resources.images.resources.Stone_mine.jpg");