Как реализовать мигающую метку на форме

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

РЕШЕНИЕ:

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

Ответ 1

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

Ответ 2

Мигание выполняется с помощью async и await

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

Ответ 3

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() в метод для этого элемента управления.

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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