Как реализовать мигающую метку на форме - PullRequest
14 голосов
/ 18 февраля 2011

У меня есть форма, которая отображает очередь сообщений и номер, который эти сообщения могут быть изменены.На самом деле я хочу мигать меткой (длина очереди), когда количество сообщений было увеличено, чтобы улучшить удобство использования формы.Должен ли я реализовать пользовательский контроль и использовать дополнительную нить или таймер для изменения цвета этикетки?Кто-нибудь реализовал такую ​​функциональность?Какое лучшее решение (меньше ресурсов и меньше снижение производительности) для реализации такого поведения?

РЕШЕНИЕ:

Компонент формы с таймером, который может ограничить количествоанимаций в секунду и реализуют эффект затухания для внешнего цвета фона управления.

Ответы [ 7 ]

24 голосов
/ 18 марта 2015

Следующее мигает с использованием async и await

private async void Blink(){
    while (true){
        await Task.Delay(500);
        label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
    }
}
14 голосов
/ 18 февраля 2011
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() в метод для этого элемента управления.

13 голосов
/ 10 июня 2017

Я знаю, что это действительно старая публикация, но любой, кто ищет что-то более универсальное, чем опубликованные булевы решения, может воспользоваться следующим: 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 голосов
/ 18 февраля 2011

Создайте для этого свой собственный UserControl, который наследуется от Label, а не от Control напрямую.Добавьте метод StartBlinking, в котором вы запускаете объект Timer, чье событие tick меняет стиль метки (изменяя свойства BackgroundColor и ForegroundColor каждый раз, чтобы создать эффект мерцания).

Вы также можетедобавьте StopBlinking метод, чтобы отключить его, или вы можете сделать так, чтобы Timer остановился сам через 5 секунд, возможно.

3 голосов
/ 18 февраля 2011

Можете ли вы использовать вместо этого анимированный .gif (возможно, в качестве фона числа)?это бы выглядело как веб-страницы старой школы, но могло бы работать.

2 голосов
/ 18 февраля 2011

Вы можете создать пользовательский компонент и события для начала мигания. Я думаю, что это хорошее решение. Мигание можно осуществить с помощью таймера.

0 голосов
/ 20 августа 2018

Вы можете использовать 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";
        }
    }
...