我在资源中有大约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**_;
但是没有办法将变量插入资源名称;我该怎么做才能解决这个问题?
答案 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}_
。