0

这是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(); ;
            }
        }

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

4

3 回答 3

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;
    }

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

于 2012-08-04T10:21:02.887 回答
1

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

要获得所需的效果,请将 UI 的代码与执行工作的代码分开......

单击按钮时,更改其外观并启动一些完成工作的后台任务(线程池、后台工作人员等)

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

如果您有很多这样的 UI 重置内容,您应该考虑在表单上设置一个计时器,以每隔 200 毫秒检查一次是否有需要重置/完成的内容

您可以使用带有元组 (Datetime,delegate) 的排序列表,一旦时间到了,这些元组就会被执行和删除......

于 2012-08-04T10:07:22.477 回答
0

在线程中编写其余代码并触发该线程。这将使您的 UI 响应并为您提供所需的按钮输出。或者使用 btnedit。在更改颜色以强制按钮重绘自身后刷新()

于 2012-08-04T09:59:39.503 回答