在随机显示时,避免同一图像同时显示多个图标
本文关键字:显示 图标 图像 随机 | 更新日期: 2023-09-27 18:28:00
我使用此代码使用计时器一次在3个图片框中随机显示图像,现在我用文件夹中的5个图像进行测试,最初它在其中3个图片盒中正确显示不同的图像,但后来相同的图像出现在其中2个图片框,甚至其中3个显示相同的图像,如何避免在多个图片框中同时显示同一图像
public partial class Form2 : Form
{
Random random = new Random();
List<String> filesToShow = new List<string>();
List<PictureBox> pictureBoxes;
string LoginName;
public Form2(string userName)
{
InitializeComponent();
this.LoginName = userName;
label1.Text = "Welcome " + userName;
timer2 = new Timer();
pictureBoxes = new List<PictureBox> {
pictureBox3,
pictureBox4,
pictureBox5
};
// Setup timer
timer2.Interval = 5 * 1000; //1000ms = 1sec
timer2.Tick += new EventHandler(timer2_Tick);
timer2.Start();
panelHide = panel4;
}
public static Panel panelHide = new Panel();
private void ShowRandomImages()
{
foreach (var pictureBox in pictureBoxes)
{
if (filesToShow != null && !filesToShow.Any())
{
filesToShow = GetFilesToShow();
}
if (filesToShow != null && filesToShow.Any()) // If any files then allow the code to delete the shown images
{
int index = random.Next(0, filesToShow.Count);
string fileToShow = filesToShow[index];
pictureBox.ImageLocation = filesToShow[index];
filesToShow.RemoveAt(index);
}
}
}
private List<String> GetFilesToShow()
{
String str = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string path = str + "''Image''";
return Directory.GetFiles(path, "*.jpg", SearchOption.TopDirectoryOnly).ToList();
}
private void timer2_Tick(object sender, EventArgs e)
{
if (sender == timer2)
{
ShowRandomImages();
}
}
}
提前感谢的任何帮助
一个非常简单的解决方案是创建一个包含所选图像的列表,并在显示新图像之前对其进行检查。
private void ShowRandomImages()
{
List<int> selectedImages = new List<int>();
foreach (var pictureBox in pictureBoxes)
{
if (filesToShow != null && !filesToShow.Any())
{
filesToShow = GetFilesToShow();
}
if (filesToShow != null && filesToShow.Any()) // If any files then allow the code to delete the shown images
{
int index = -1;
if (filesToShow.Count >= pictureBoxes.Count)
{
bool bOk = false;
while( !bOk )
{
index = random.Next(0, filesToShow.Count);
bOk = selectedImages.IndexOf(index) == -1;
}
}
else
{
index = random.Next(0, filesToShow.Count);
}
selectedImages.Add(index);
string fileToShow = filesToShow[index];
pictureBox.ImageLocation = filesToShow[index];
filesToShow.RemoveAt(index);
}
}
}
希望能有所帮助。
当然,当您在filesToShow
列表中显示最后一个图像时,会发生错误,因此列表变为空,导致执行
if (filesToShow != null && !filesToShow.Any())
{
filesToShow = GetFilesToShow();
}
之后,您的filesToShow
已经删除了所有先前的图像,因此可以再次显示它们。