gar*_*rik 15 c# usability controls user-experience winforms
我有一个显示消息队列的表单,并且可以更改此消息的编号.真的我想在消息数量增加时闪烁标签(队列长度)以提高形式可用性.我应该实现自定义控件并使用其他线程或计时器来更改标签的颜色吗?有人实现了这么的功能吗?实现这样的行为的最佳解决方案(更少的资源和更少的性能降级)是什么?
解:
带有计时器的表单组件,可以限制每秒的动画数量,并对外部控件背景颜色实现淡出效果.
Ido*_*nts 25
以下是使用async和闪烁await
private async void Blink(){
while (true){
await Task.Delay(500);
label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
}
}
Run Code Online (Sandbox Code Playgroud)
Jim*_*son 15
我知道这是一个非常古老的帖子,但是任何寻找比布尔解决方案更通用的东西的人都可以从以下方面获得一些用处:

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;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以这样打电话:
SoftBlink(lblWarning, Color.FromArgb(30, 30, 30), Color.Red,2000,false);
SoftBlink(lblSoftBlink, Color.FromArgb(30, 30, 30), Color.Green, 2000,true);
Run Code Online (Sandbox Code Playgroud)
use*_*211 14
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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的实现,可以在您的表单中使用.您还可以使用相同的代码创建自定义控件,然后将其Timer.Start()放入该控件的方法中.