Ответ 1
Вы можете создать пользовательский компонент и события для начала мигать. Я думаю, это хорошее решение. Мигает, вы можете реализовать с помощью таймера.
У меня есть форма, отображающая очередь сообщений и номер, которые могут быть изменены. Действительно, я хочу мигать надписи (длина очереди), когда количество сообщений было увеличено, чтобы улучшить удобство использования формы. Должен ли я реализовать собственный элемент управления и использовать дополнительный поток или таймер для изменения цвета метки? Кто-нибудь реализовал такую функциональность? Какое наилучшее решение (меньше ресурсов и снижение производительности) для реализации такого поведения?
РЕШЕНИЕ:
Компонент формы с таймером, который ограничивает число анимаций в секунду и реализует эффект постепенного уменьшения цвета внешнего управления цветом.
Вы можете создать пользовательский компонент и события для начала мигать. Я думаю, это хорошее решение. Мигает, вы можете реализовать с помощью таймера.
Мигание выполняется с помощью async
и await
private async void Blink(){
while (true){
await Task.Delay(500);
label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
}
}
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()
в метод для этого элемента управления.
Я знаю, что это действительно старая должность, но любой, кто ищет что-то более универсальное, чем выпущенные булевы решения, может извлечь из этого следующее:
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);
Создайте свой собственный UserControl
для этого, который наследует от Label
, а не от Control
напрямую. Добавьте метод StartBlinking
, в котором вы запускаете объект Timer
, чье событие tick изменяет стиль метки (каждый раз изменяя свойства BackgroundColor и ForegroundColor, чтобы создать эффект blink).
Вы также можете добавить метод StopBlinking
, чтобы отключить его, или вы можете остановить Timer
через 5 секунд, возможно.
Можете ли вы использовать анимированный .gif
вместо этого (возможно, в качестве фона номера)? это сделало бы его похожим на старые школьные веб-страницы, но это может сработать.