将资源中的PNG加载到Picturebox中(使用Random Int Generator)

时间:2014-12-20 05:38:42

标签: c# image resources png picturebox

我在资源中有大约600张图片,格式如下:

  

戳(1).png

     

戳(2).png

     

戳(3).png

等等。

以下是我正在处理的代码示例:

pictureBox1.Image = (Image)Properties.Resources.poke__1_;

这行代码可以加载第一个图像,如poke(1).png

但我希望能够像这样加载随机图像:

int num = rand.Next(0, 600);
pictureBox1.Image = (Image)Properties.Resources.poke__**num**_;

但是没有办法将变量插入资源名称;我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

你可以这样做:

string name;

// Generate the random name.

pictureBox1.Image = (System.Drawing.Image)Properties.Resources.ResourceManager.GetObject(name, Properties.Resources.Culture);

另外,if you are sure that this is the only place that sets the image,为了提高内存性能,您可能需要处理旧图像:

using (pictureBox1.Image)
{
    pictureBox1.Image = (System.Drawing.Image)Properties.Resources.ResourceManager.GetObject(name, Properties.Resources.Culture);
}

您必须使用原始文件名poke ({0}).png,而不是使用下划线替换characters that are invalid in a c# property name的静态属性名称。

当然,您在从静态资源管理器属性中获取图像时会丢失编译时类型检查。

<强>更新

如果您不想对精确数量的图像属性进行硬编码,则可以对名称与模式匹配的Properties.Resources中的所有图像值静态属性使用反射和查询,如下所示:

public static class ResourceHelper
{
    public static PropertyInfo [] GetStaticPropertiesOfType<TValue>(Type type)
    {
        return type
          .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
          .Where(p => typeof(TValue).IsAssignableFrom(p.PropertyType) && p.GetIndexParameters().Length == 0 && p.GetGetMethod(true) != null)
          .ToArray();
    }
}

然后,在你的课堂上:

        var regex = new Regex(@"^poke__\d+_$");
        var propertyDictionary = ResourceHelper.GetStaticPropertiesOfType<Image>(typeof(Properties.Resources)).Where(p => regex.IsMatch(p.Name)).ToDictionary(p => p.Name);
        foreach (var property in propertyDictionary.Values)
        {
            pictureBox1.Image = (Image)property.GetValue(null, null);
        }

在这里,您应该使用已替换无效属性字符的错位名称poke__{0}_