从其他线程更改按钮的颜色

时间:2016-03-08 14:44:22

标签: c# multithreading

我有一个包含按钮的表单,我试图从不同类别(从黄色到红色)的不同线程更改按钮的颜色,但颜色保持不变。

创建对象(这是在form1中):

   Button b = new Button();
   b.Location = new Point(gameBoard[playerPosX,playerPosY].m_lbl.Location.X, gameBoard[playerPosX, playerPosY].m_lbl.Location.Y);   
   b.Parent = gameBoard[playerPosX, playerPosY].m_lbl;
   b.BackColor = Color.Black;
   b.Size = new Size(17, 17);
   b.FlatStyle = FlatStyle.Flat;
   b.Enabled = false;
   b.Text = "BASIC";
   this.Refresh();
   b.BringToFront();
   buildings.Add(new Structure("basic", b,playerPosX,playerPosY));
   Controls.Add(buildings[buildings.Count - 1].m_btn); 

这是对象线程正在执行的方法:

public void basicOperation()
    {
        while (true)
        {
            Form1.ChangeControlColor(Color.Yellow,m_btn);
            Thread.Sleep(1000);
            Form1.ChangeControlColor(Color.Red,m_btn);
        }
    }

这里是form1.ChangeControlColor:

    delegate void SetColorCallBack(Color c,Button b);
    public static void ChangeControlColor(Color c,Button b)
    {
        if (b.InvokeRequired)
        {
            SetColorCallBack d = new SetColorCallBack(ChangeControlColor);
            b.Invoke(d, new object[] { c,b });
        }
        else
        {
            b.BackColor = c;
            b.BringToFront();
            b.Refresh();
        }
    }

以下代码不起作用,按钮的颜色保持黄色。 我很感激你的时间。

1 个答案:

答案 0 :(得分:2)

Eliran,

您的多线程代码似乎没问题。

因为将颜色设置为红色和黄色之间没有延迟,所以您可能看不到黄色以外的其他颜色。

尝试在设置黄色和红色之间添加延迟:

while (true)
    {
        Form1.ChangeControlColor(Color.Yellow,m_btn);
        Thread.Sleep(500);
        Form1.ChangeControlColor(Color.Red,m_btn);
        Thread.Sleep(500);
    }

此致