在C#中暂时更改按钮上的按钮颜色

时间:2012-08-04 09:12:13

标签: c# button lambda serial-port background-color

这是 Win表格

在按钮上单击我想暂时更改按钮的颜色1秒,然后按钮颜色应该恢复到以前的颜色。我为此使用了lambda表达式和计时器。

    private void btn_Read_Click(object sender, EventArgs e)
    {
            System.Windows.Forms.Timer t1 = new System.Windows.Forms.Timer();
            t1.Interval = 1000;
            t1.Tick += (src, ee) => 
            {
                btn_Read.BackColor = Color.Transparent; t1.Stop();
            };
            t1.Start();
            btn_Read.BackColor = Color.YellowGreen;
            lvwMessages.Items.Clear();
            string strcommand = "AT+CMGL=\"ALL\"";
            objShortMessageCollection = ReadSMS(strcommand); // Line wher I am reading messages from the port
            foreach (ShortMessage msg in objShortMessageCollection)
            {
                ListViewItem item = new ListViewItem(new string[] { msg.Sender, msg.Message, msg.Sent, msg.Index });
                item.Tag = msg;
                lvwMessages.Items.Insert(0, item);
            }
            if (lvwMessages.Items.Count == 0)
            {
                status_other.Visible = true;
                status_other.Text = "No messages";
                lbl_total.Text = "Total: 0";
                System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
                timer1.Interval = 2000;
                timer1.Tick += (source, ex) => { status_other.Visible = false; timer1.Stop(); };
                timer1.Start();
            }
            else
            {
                status_other.Visible = false;
                chk_selectmsg.Visible = true;
                btn_delete.Visible = true;
                lbl_total.Text = "Total: " + lvwMessages.Items.Count.ToString(); ;
            }
        }

稍后在这段代码中,我正在从串口读取数据,显示它等等。问题是当我点击按钮时按钮颜色不会改变。这需要一些时间,并没有给我想要的理想感觉。有时甚至不会改变颜色。可能是什么原因?

3 个答案:

答案 0 :(得分:2)

一个简单的解决方案是使用鼠标悬停事件和鼠标离开事件

以这种方式使用:

    private void btn_Read_MouseHover(object sender, EventArgs e)
    {
        btn_Read.BackColor = Color.AliceBlue;
    }

    private void btn_Read_MouseLeave(object sender, EventArgs e)
    {
        btn_Read.BackColor = Color.AntiqueWhite;
    }

这不需要对代码进行任何更改,并且肯定会为您提供功能。看看它是否有帮助!

答案 1 :(得分:1)

你应该避免在UI线程上使用工作密集型代码

要获得所需的效果,请从执行工作的代码中为UI添加代码...

单击该按钮时,更改其外观并启动执行该工作的后台任务(线程池,后台工作者等)

请注意,您只能从创建它的线程与控件进行交互,因此要显示您的数据或与UI交互,您必须调用UI线程(请参阅Control.Invoke(...)

如果你有很多这样的UI重置,你应该考虑表格上的一个计时器,检查每个让我们说200ms,如果有什么要重置/完成

你可以使用带有元组(Datetime,delegate)的排序列表,这些元素会在时间到来之后执行和删除...

答案 2 :(得分:0)

将其余代码写入线程并触发该线程。这将使您的UI响应,并将为您提供所需的按钮输出。或者在改变颜色后使用btnedit。Refresh()强制按钮重绘自己