如何在点击事件上显示标签图像

时间:2016-05-23 10:23:35

标签: c#

我需要制作一个简单的匹配游戏。有了这个匹配游戏,我需要在点击它时显示图像。在点击事件之前,只显示一种颜色。我已经有一种方法可以将图像分配给标签,如下所示:

    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索引。但我不知道怎么做。我在这里可能完全错了,但我想听到一个很好的方法。有人可以帮帮我吗?我现在真的很无能为力。

这些是它应该经历的步骤:

  1. 当应用程序启动时,标签不应有图像

  2. 当用户点击标签时,会显示在imgToLbl()方法中指定的图像

  3. 图片现在可见

  4. 注:

    我无法使用图片框代替标签。我们必须使用标签。否则我不会问这个问题

2 个答案:

答案 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>个图像进行匹配。