我需要制作一个简单的匹配游戏。有了这个匹配游戏,我需要在点击它时显示图像。在点击事件之前,只显示一种颜色。我已经有一种方法可以将图像分配给标签,如下所示:
private void imgToLbl()
{
foreach (Control ctrl in tableLayoutPanel1.Controls)
{
Label imgLbl = ctrl as Label;
if (imgLbl != null)
{
int rndNum = rndImage.Next(0, files.Count);
imgLbl.Image = files[rndNum];
lbls.Add(imgLbl);
imags.Add(imgLbl.Image);
ints.Add(rndNum);
files.RemoveAt(rndNum);
}
}
}
我还认为我必须为最终分配的图像和标签制作另外两个列表。所以我可以使用int列表作为索引指示符在click事件中再次分配它们。我已经有一部分点击事件:
private void label_click(object sender, EventArgs e)
{
Label clickLbl = sender as Label;
if (clickLbl != null)
{
}
}
我的想法是,不知何故,我必须检查标签列表中clickLbl的te索引。但我不知道怎么做。我在这里可能完全错了,但我想听到一个很好的方法。有人可以帮帮我吗?我现在真的很无能为力。
这些是它应该经历的步骤:
当应用程序启动时,标签不应有图像
当用户点击标签时,会显示在imgToLbl()方法中指定的图像
图片现在可见
注:
我无法使用图片框代替标签。我们必须使用标签。否则我不会问这个问题
答案 0 :(得分:2)
您似乎有很多不相关的代码,并省略了一些相关的代码。因此,我们必须对您实际要求的内容进行逆向工程。
您似乎拥有N个图像文件的集合,并且在您的表单上有一个包含N Label控件的面板。您希望将图像随机分配给标签,但仅在单击标签时在标签上显示图像。
首先,我强烈建议您关注the General Naming Conventions,不要使用匈牙利表示法,也不要使用缩写。
话虽这么说,您的问题可以使用Control.Tag
属性来解决,您可以在其中存储有关控件的信息。
所以你的“imgToLbl
”方法就变成了这个:
private List<Image> _files = { /* however this works */ };
private void RandomizeImages()
{
// Randomize the file list.
// See http://stackoverflow.com/questions/273313/randomize-a-listt
Shuffle(_files);
int imageIndex = 0;
// Loop over all labels to assign an image index.
foreach (Control control in tableLayoutPanel1.Controls)
{
var imageLabel = control as Label;
if (imageLabel == null)
{
continue;
}
imageLabel.Tag = imageIndex;
imageIndex++;
}
}
此方法将List<Image>
的索引存储在Label.Tag
属性中,这样在单击标签时,您可以检查标记的值并使用它来索引到图像集合中:
private void Label_Click(object sender, EventArgs e)
{
Label clickedLabel = sender as Label;
if (clickedLabel != null)
{
var imageIndex = (int)clickedLabel.Tag;
clickedLabel.Image = _files[imageIndex];
}
}
答案 1 :(得分:0)
你可以使用tableLayoutPanel1.Controls.GetChildIndex(clickLbl)
来获取控件的索引;这与您当前初始化标签的方式一致。
或者你可以自己在List<Label>
中保持对控件的引用,并以编程方式将它们添加到父控件中 - 这样可以节省你(好吧,本来可以节省你:P)设计师的很多工作,你会更少依赖WinForms如何控制其Control
。
它还可以让您完全控制索引,因此您可以将它们与List<Image>
个图像进行匹配。