首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在固定时间内更改按钮的backColor?

如何在固定时间内更改按钮的backColor?
EN

Stack Overflow用户
提问于 2018-08-29 22:11:11
回答 1查看 48关注 0票数 1

当某个值来自串口时,我想在固定时间内更改ButtonBackColor。我在这里设置了Timer对象:

代码语言:javascript
复制
public formLabel()
{
    InitializeComponent();
    // ...
    timerColor.Tick += timerColor_Tick;
    timerColor.Interval = 3000;
}

然后,当我从串行端口接收信号时:

代码语言:javascript
复制
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    MessageBox.Show("Dati Ricevuti: " + indata);
    if (indata.CompareTo("K") == 0)
    {
        timerColor.Enabled = true;
        btnEsito.BackColor = Color.Green;
        btnEsito.Text = "GOOD";
        // Do something
    }
    if (indata.CompareTo("O") == 0)
    {
        timerColor.Enabled = true;
        btnEsito.BackColor = Color.Red;
        btnEsito.Text = "NO GOOD";
    }
}

下面是停止计时器的方法:

代码语言:javascript
复制
private void timerColor_Tick(object sender, EventArgs e)
{
    MessageBox.Show("HERE!");
    timerColor.Enabled = false;
    btnEsito.BackColor = Color.White;
}

根据我收到的信号类型,btnEsitoBackColor会变成绿色或红色,但程序不会显示消息"HERE!",按钮也不会返回白色。

有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-29 23:09:03

System.Windows.Forms.Timer是为单线程设计的,需要在UI线程上启动和停止。您正尝试在单独的线程上启动计时器,因此需要确保修改timer Enabled属性是在UI线程上完成的。您可以通过创建一个委托方法并从您的事件处理程序中调用该方法来实现这一点-可能如下所示:

代码语言:javascript
复制
delegate void TimerDelegate(bool Enable);
private void ControlTimer(bool Enable)
{
  timerColor.Enabled = Enable;
}

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    MessageBox.Show("Dati Ricevuti: " + indata);
    if (indata.CompareTo("K") == 0)
    {
        Invoke((TimerDelegate)ControlTimer, true);
        btnEsito.BackColor = Color.Green;
        btnEsito.Text = "GOOD";
        // Do something
    }
    if (indata.CompareTo("O") == 0)
    {
        Invoke((TimerDelegate)ControlTimer, true);
        btnEsito.BackColor = Color.Red;
        btnEsito.Text = "NO GOOD";
    }
}

private void timerColor_Tick(object sender, EventArgs e)
{
    MessageBox.Show("HERE!");
    Invoke((TimerDelegate)ControlTimer, false);
    btnEsito.BackColor = Color.White;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52079525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档