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

时间:2011-02-18 14:32:44

标签: c# winforms controls usability user-experience

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

SOLUTION:

Form的组件带有计时器,可以restrict number of animations per second并实现淡出效果到外部控制背景颜色。

7 个答案:

答案 0 :(得分:21)

以下内容使用asyncawait

闪烁
private async void Blink(){
    while (true){
        await Task.Delay(500);
        label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
    }
}

答案 1 :(得分:12)

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

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

答案 2 :(得分:10)

我知道这是一个非常古老的帖子,但是任何寻找比布尔解决方案更通用的东西的人都可以从以下方面获得一些用处: enter image description here

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

您可以这样打电话:

SoftBlink(lblWarning, Color.FromArgb(30, 30, 30), Color.Red,2000,false);
SoftBlink(lblSoftBlink, Color.FromArgb(30, 30, 30), Color.Green, 2000,true);

答案 3 :(得分:2)

您可以使用动画.gif代替(可能作为数字的背景)吗?它会让它看起来像旧学校的网页,但它可能会有用。

答案 4 :(得分:2)

为此创建自己的UserControl,一个直接从Label而非Control继承的StartBlinking。添加Timer方法,在其中启动StopBlinking对象,其tick事件会改变标签的样式(每次更改BackgroundColor和ForegroundColor属性以创建闪烁效果)。

你也可以添加一个Timer方法来关闭它,或者你可以让你的{{1}}在5秒后自行停止。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

您可以在此处使用Timer类。 在这里,我已经实现了。 标签颜色在​​Button_click事件上闪烁。

//click event on the button to change the color of the label
public void buttonColor_Click(object sender, EventArgs e)
        {
            Timer timer = new Timer();
            timer.Interval = 500;// Timer with 500 milliseconds
            timer.Enabled = false;

            timer.Start();

            timer.Tick += new EventHandler(timer_Tick);
        }

       void timer_Tick(object sender, EventArgs e)
    {
        //label text changes from 'Not Connected' to 'Verifying'
        if (labelFirst.BackColor == Color.Red)
        {
            labelFirst.BackColor = Color.Green;
            labelFirst.Text = "Verifying";
        }

        //label text changes from 'Verifying' to 'Connected'
        else if (labelFirst.BackColor == Color.Green)
        {
            labelFirst.BackColor = Color.Green;
            labelFirst.Text = "Connected";
        }

        //initial Condition (will execute)
        else
        {
            labelFirst.BackColor = Color.Red;
            labelFirst.Text = "Not Connected";
        }
    }