是否有将图片分配给许多按钮的更快方法?

时间:2019-05-25 13:47:29

标签: c# winforms

我有一个Windows窗体应用程序,我需要为所有100个按钮分配一个图像,问题是,我每次都需要随机进行操作……是否有更快的方法?

我的第一个想法是使用将图像分配给变量然后将图像分配给按钮的基本方法:

Bitmap P_Farm = new Bitmap(@"IMAGE PATH.jpeg");

this.button1.Image = P_Farm;

但是问题在于我将需要对所有100个按钮执行此操作。

this.button1.Image = P_Farm; // "P_Farm is just the path to the image"
this.button2.Image = P_Farm;
this.button3.Image = P_Farm;
this.button4.Image = P_Farm;

我想保持代码尽可能干燥。 我不能仅通过“属性”窗口中的“图像”选项来执行此操作的原因是,最终我将为应用程序的每次加载中的每个按钮获得一个随机图像。所以首先是

this.button1.Image = Z_Farm;
this.button2.Image = C_Farm;
this.button3.Image = P_Farm;
this.button4.Image = P_Farm;

然后

this.button1.Image = P_Farm;
this.button2.Image = P_Farm;
this.button3.Image = Z_Farm;
this.button4.Image = Z_Farm;

我想知道是否可以进行一些操作,例如读取文本文件中的每一行,但是按钮不会更改,而是每次尝试都会更改该行

int i = 0;

while (true) // Something like this loop but changing not the line, but the button
{
    this.button[i].image = P_Farm; // this obviously doesn't work
    I++;
}

希望这很有道理

非常感谢!

1 个答案:

答案 0 :(得分:2)

您还可以循环浏览表单中的所有控件,找到按钮的控件并以这种方式更改其图像。当然,您不想全部更改。我通常要做的是为Tag属性设置一个数字:

        foreach (Control control in Controls)
        {
            if (control is Button theButton && (int)theButton.Tag == 5)
            {
                theButton.Image = P_Farm;
            }
        }

如果您的面板也要更改按钮,则此操作将无效。您将必须编写一个递归函数,该递归函数涉及表单中所有可能的容器,例如面板。 如果要更改容器(如面板)中的所有按钮,则只能将foreach行更改为foreach (Control control in panel.Controls)之类。

将来,当您确定并非所有按钮都具有相同的图像时,可以基于tag属性设置图像,如下所示:

        foreach (Control control in Controls)
        {
            if (control is Button theButton && (int)theButton.Tag >= 5)
            {
                switch ((int) theButton.Tag)
                {
                    case 100:
                        theButton.Image = P_Farm;
                        break;
                    case 101:
                        theButton.Image = Z_Farm;
                        break;
                }
            }
        }

因为我们假设所有按钮的int属性中都有一个tag,所以您应该在所有按钮上添加一个数字,包括那些不应更改的数字,例如“取消”和“确定”按钮。诸如零之类的东西会将它们从图像分配中排除。

我确信有更好的方法。我有一段时间没有做WinForms了。