4

我正在尝试制作一组​​ 8x8 按钮,到目前为止它可以工作。现在我偶然发现了一个问题。我希望按钮的颜色(背景颜色)在单击时发生变化。并在再次单击时更改为不同的颜色。

到目前为止,这是我的代码:

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Button[,] btn = new Button[8,8];

        public Form1()
        {
            InitializeComponent();

            for (int x = 0; x < btn.GetLength(0); x++)
            {
                for (int y = 0; y < btn.GetLength(1); y++)
                {
                    btn[x,y] = new Button();
                    btn[x,y].SetBounds(40 * x, 40 * y, 40, 40);
                    btn[x,y].Click += new EventHandler(this.btnEvent_click);
                    Controls.Add(btn[x, y]);
                    btn[x,y].BackColor = Color.Black;
                }
            }

            /* 
            btn.Click += new EventHandler(this.btnEvent_click);
            btn[x,y].Text = Convert.ToString(x+","+y);
            Controls.Add(btn);
            btn[x,y].Click += new EventHandler(this.btnEvent_click);
            */
        }

        private void form1_load(object sender, EventArgs e)
        {

        }

        void btnEvent_click(object sender, EventArgs e)
        {
           (Control)sender).BackColor = Color.Red;
        }
    }
}

到目前为止,我只能将颜色更改为红色,并且我已经尝试了多个 if 和 for 语句来第二次更改颜色。

谁能帮帮我?

4

7 回答 7

5

您好临时您可以使用以下解决方案:

void btnEvent_click(object sender, EventArgs e)
{
    Control ctrl = ((Control)sender);
    switch (ctrl.BackColor.Name)
    {
        case "Red":
            ctrl.BackColor = Color.Yellow;
            break;
        case "Black":
            ctrl.BackColor = Color.White;
            break;
        case "White":
            ctrl.BackColor = Color.Red;
            break;
        case "Yellow":
            ctrl.BackColor = Color.Purple;
            break;
        default:
            ctrl.BackColor = Color.Red;
            break;
    }
}

我知道也可以有更好的解决方案,但同时你可以用这个......你也可以根据需要在 switch 语句中添加更多颜色

于 2012-12-19T10:34:10.663 回答
2

您可以创建一个新类,继承自 Button 并在内部处理颜色变化,如下所示:

class TwoColorButton : Button
{
    private int stateCounter = 0;
    private Color[] states = new Color[] { Color.Black, Color.Red };

    public TwoColorButton()
        : base()
    {
        this.BackColor = states[stateCounter];
        this.Click += this.clickHandler;
    }

    protected void clickHandler(object sender, EventArgs e)
    {
        stateCounter = stateCounter == 0 ? 1 : 0;
        this.BackColor = states[stateCounter];
    }
}
于 2012-12-19T10:29:58.907 回答
1

您可以使用 Color.FromArgb(int) 方法和 Random 类。见下文:

Random rnd = new Random();

//Alpha set allways 255
Color.FromArgb(255, rnd.Next(255), rnd.Next(255), rnd.Next(255));

//Or Completly random
Color.FromArgb(rnd.Next());
于 2012-12-19T10:21:48.973 回答
0

你试过类似的东西吗?

    void btnEvent_click(object sender, EventArgs e)
    { 
       if ((Control)sender).BackColor != Color.Red)
           (Control)sender).BackColor = Color.Red;
       else 
           (Control)sender).BackColor = Color.Green;
    }
于 2012-12-19T10:18:37.373 回答
0

试试看..它的工作...

在 button1 点击事件内部:

Random randomGen = new Random();
KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);
button1.BackColor = randomColor;
于 2012-12-19T10:20:12.823 回答
0

您总是可以创建一个继承按钮类的类,然后为其添加一个计数器,例如单击它的频率,然后在每次单击时增加它,然后根据该单击更改颜色

于 2012-12-19T10:21:02.753 回答
0

如果你想通过一组固定的颜色“循环”,你可以尝试这样的事情:

void btnEvent_click(object sender, EventArgs e)
{
    var button = (Button)sender;
    switch(button.BackColor)
    {
        case Color.Black: { button.BackColor= Color.Red;} break;
        case Color.Red: { button.BackColor= Color.Blue;} break;
        case Color.Blue: { button.BackColor= Color.Green;} break;
        // and so on ... don't forget the default clause, just in case
        default: { button.BackColor= Color.Black;} break;
    }
}
于 2012-12-19T10:25:20.897 回答