我有一个名为studPic
的图片框。我想要的是,当我点击“随机播放”按钮时,从资源中获取随机图像。
private void button2_Click(object sender, EventArgs e)
{
...
}
经过研究,我发现了以下
我是C#的新手..有没有更简单的方法来实现这个结果?例如,没有添加图片名称?
List<string> pictureNames = new List<string>();
pictureNames.Add("1");
pictureNames.Add("2");
pictureNames.Add("3");
int randomPictureIndex = new Random().Next(0, pictureNames.Count);
string randomPictureName = pictureNames[randomPictureIndex];
pictureNames.Remove(randomPictureName);
Image img = Properties.Resources.randomPictureName; //erroor
studPic.Image = img;
收到错误消息 错误1'Properties.Resources'不包含'randomPictureName'的定义
答案 0 :(得分:3)
我不会为此使用系统资源。它们不像断开连接软件的文件系统那样可维护。
将您的图片放在应用的文件夹中。通过这种方式,可以轻松更新/更改它们。 说:
C:\Ninjas - app
c:\Ninjas\images - images
创建一个包含这些图像的数组。
string[] files = System.IO.Directory.GetFiles("c:\ninjas\images");
您需要在GetFiles上放置一些过滤器,以确保您只能获得图片。
现在抓住该数组中的一个随机位置(你已经显示你知道如何做随机数)。
我们有阵列,让它随机播放然后你可以顺序完成它们(比随机选择更快.CPU会爱你吧)
private string[] files;
private int currentIndex = 0;
private void initializeImages()
{
//Grab directories in your images directory
string appRoot = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
files = System.IO.Directory.GetFiles(appRoot + @"\images");
Random rnd = new Random();
files = files.OrderBy(x => rnd.Next()).ToArray();
}
private void setImage()
{
pictureBox1.ImageLocation = files[currentIndex];
}
private void previousImage()
{
currentIndex = currentIndex > 0 ? currentIndex - 1 : 0;
setImage();
}
private void nextImage()
{
currentIndex = currentIndex < files.Length - 1 ? currentIndex + 1 : files.Length - 1;
setImage();
}
一些事情:
如果您希望将此作为幻灯片放映,直到用户取消它,我建议您使用以下内容:
如果你想添加下一个/上一个按钮,你需要有一个可以增加/减少的全局索引(比如currentIndex),然后调用代码来设置图像
答案 1 :(得分:1)
您需要进行一些设置,但反对者大多是正确的。对于生产应用程序,这不是一个非常有效的解决方案。话虽如此,我怀疑这是你分发给很多人的东西,所以我们称之为学术练习。如果您只是简单地向应用程序添加资源并将其命名为“ImageResource”(任何名称都可以),并将图像添加到其中,则可以使用以下代码(假设存在相应的UI元素)。
首先,我们创建一个从资源中提取位图的函数。
private Bitmap[] GetResourceImages()
{
PropertyInfo[] props = typeof(ImageResource).GetProperties(BindingFlags.NonPublic | BindingFlags.Static);
var images = props.Where(prop => prop.PropertyType == typeof(Bitmap)).Select(prop => prop.GetValue(null, null) as Bitmap).ToArray();
return images;
}
其次,我们创建了一个基于可用图像随机化图像的函数:
private void RandomizePicture()
{
Bitmap[] images = GetResourceImages();
if (images == null || images.Length == 0)
{
//Nothing to do here...
return;
}
int maxValue = images.Length;
Random r = new Random();
int idx = r.Next(maxValue);
this.uxStupidPic.Image = images[idx];
}
最后,点击按钮调用该功能:
private void btnRandmoize_Click(object sender, EventArgs e)
{
this.RandomizePicture();
}
瞧,来自资源文件的随机图像。快乐的编码!
编辑:刚刚注意到你说你使用的是Application资源而不是随机资源文件。只需在GetResourceImages中将“ImageResource”替换为“Properties.Resources”,您就可以开展业务了。答案 2 :(得分:0)
我喜欢Ryan Ternier的回答非常简单和优雅,我打算发布一个类似于他的解决方案。
我只是想评论为什么行没有/不应该工作的原因:
Image img = Properties.Resources.randomPictureName;
http://msdn.microsoft.com/en-us/library/7k989cfy(v=vs.80).aspx