使用C#更新Windows窗体中的文本框时,如何编写"闪存"效果?

Mik*_*ebb 6 c# animation textbox backcolor winforms

我所拥有的是一个Windows窗体,在C#中,有7个文本框.当其值更改并被接受时,每个文本框都会更新2或3个其他文本框.我想要做的是以某种方式采取那些需要更新的文本框,并使用浅色或其他东西使它们"闪烁".目的是向用户显示正在更新的内容,增加了一点天赋.

我不确定是否有一种简单的方法可以做到这一点,这就是我在这里问的原因.我可以使用计时器,while循环和背面颜色,文本框上的alpha通道递减控制背面颜色,我想,但我想看看是否有更好的方法.

jQuery UI有一个"突出显示"效果,显示我想要完成的任务(虽然我希望我的速度有点慢).只需转到jQuery UI Effects Demo页面,从窗口的下拉框中选择"highlight",然后单击"Run Effect".

编辑
我必须根据我的时间和资源限制使用我自己的解决方案,但文本框不支持Hans Passant提到的透明颜色.所以,我使用了一个自动停止计时器来增加R,G和B值,直到控制器完全变白(R = 255,G = 255,B = 255);

编辑2
在我们更新到.NET 4.0之后,使用George Johnston解决方案的变体将Flash事件重新编码为扩展方法.我觉得这是一个更清洁的解决方案,并且扩展方法可以让任何人自动使用using它.

Geo*_*ton 11

您可以为每个闪烁的文本框分离一个单独的线程,以免在您的文本框闪烁期间阻止您的表单被使用.一定要调用您的表单,因为线程的旋转将需要交叉线程.完整解决方案如下

private void Form1_Load(object sender, EventArgs e)
{
    // textBox1 is the control on your form.
    // 1000 is the total interval between flashes
    // Color.LightBlue is the flash color
    // 10 is the number of flashes before the thread quits.
    Flash(textBox1, 1000,Color.LightBlue,10);
    Flash(textBox2, 1500,Color.Green,10);
    Flash(textBox3, 100,Color.Red,10);
    Flash(textBox4, 500,Color.Brown,10);
    Flash(textBox5, 200,Color.Pink,10);
}

public void Flash(TextBox textBox, int interval, Color color, int flashes)
{
    new Thread(() => FlashInternal(textBox, interval, color, flashes)).Start();
}

private delegate void UpdateTextboxDelegate(TextBox textBox, Color originalColor);
public void UpdateTextbox(TextBox textBox, Color color)
{
    if (textBox.InvokeRequired)
    {
        this.Invoke(new UpdateTextboxDelegate(UpdateTextbox), new object[] { textBox, color });
    }
    textBox.BackColor = color;
}

private void FlashInternal(TextBox textBox, int interval, Color flashColor, int flashes)
{
    Color original = textBox.BackColor;
    for (int i = 0; i < flashes; i++)
    {

        UpdateTextbox(textBox, flashColor);
        Thread.Sleep(interval/2);
        UpdateTextbox(textBox, original);
        Thread.Sleep(interval/2);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以避免在表单上放置支持计时器控件.