如何在表单上实现闪烁标签

gar*_*rik 15 c# usability controls user-experience winforms

我有一个显示消息队列的表单,并且可以更改此消息的编号.真的我想在消息数量增加时闪烁标签(队列长度)以提高形式可用性.我应该实现自定义控件并使用其他线程或计时器来更改标签的颜色吗?有人实现了这么的功能吗?实现这样的行为的最佳解决方案(更少的资源和更少的性能降级)是什么?

解:

带有计时器的表单组件,可以限制每秒的动画数量,并对外部控件背景颜色实现淡出效果.

Ido*_*nts 25

以下是使用async和闪烁await

private async void Blink(){
    while (true){
        await Task.Delay(500);
        label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jim*_*son 15

我知道这是一个非常古老的帖子,但是任何寻找比布尔解决方案更通用的东西的人都可以从以下方面获得一些用处: 在此输入图像描述

using System.Diagnostics;
using System.Threading.Tasks;

private async void SoftBlink(Control ctrl, Color c1, Color c2, short CycleTime_ms, bool BkClr)
{
    var sw = new Stopwatch(); sw.Start();
    short halfCycle = (short)Math.Round(CycleTime_ms * 0.5);
    while (true)
    {
        await Task.Delay(1);
        var n = sw.ElapsedMilliseconds % CycleTime_ms;
        var per = (double)Math.Abs(n - halfCycle) / halfCycle;
        var red = (short)Math.Round((c2.R - c1.R) * per) + c1.R;
        var grn = (short)Math.Round((c2.G - c1.G) * per) + c1.G;
        var blw = (short)Math.Round((c2.B - c1.B) * per) + c1.B;
        var clr = Color.FromArgb(red, grn, blw);
        if (BkClr) ctrl.BackColor = clr; else ctrl.ForeColor = clr;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以这样打电话:

SoftBlink(lblWarning, Color.FromArgb(30, 30, 30), Color.Red,2000,false);
SoftBlink(lblSoftBlink, Color.FromArgb(30, 30, 30), Color.Green, 2000,true);
Run Code Online (Sandbox Code Playgroud)


use*_*211 14

Timer timer = new Timer();
timer.Interval = 500;
timer.Enabled = false;

timer.Start();

if( messagesNum > oldMessagesNum)
  timer.Tick += new EventHandler( timer_Tick );
else
  timer.Tick -= timer_Tick;

void timer_Tick( object sender, EventArgs e )
{
   if(messageLabel.BackColor == Color.Black)
      messageLabel.BackColor = Color.Red;
   else
      messageLabel.BackColor = Color.Black;
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的实现,可以在您的表单中使用.您还可以使用相同的代码创建自定义控件,然后将其Timer.Start()放入该控件的方法中.


Ser*_*kov 3

您可以创建自定义组件和事件来开始闪烁——我认为这是一个很好的解决方案。您可以使用计时器来实现闪烁。