首页 > 解决方案 > 杀死或检测动态秒表?

问题描述

我有一个动态表单,在运行时生成了不同的标签,当检测到关键的东西时,我将标签设置为通过以下方式闪烁:

SoftBlink(label, Color.FromArgb(30, 30, 30), Color.Red, 2000, true);

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 并在 while true 循环中以某种方式杀死现有的秒表?

标签: c#winformslabel

解决方案


在标签的标签属性上设置一个标志来指示它是否在闪烁。

bool? blinking = ctrl.Tag as bool?;

Stopwatch sw;
if (!blinking ?? false)
{
    ctrl.Tag = true;
    sw = new Stopwatch();
    while(true)
    {
        // do stuff
    }
    ctrl.Tag = false; // doesn't look like you would ever reach this point.
}

推荐阅读