C# winform 闪烁标签背景色延迟
C# winform blink label backcolor with delay
我有一个 winform 应用程序,我需要使标签背景颜色闪烁。我正在尝试使用 for 循环和 Thread.Sleep 来做到这一点,但不起作用。感谢您的帮助和建议:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000); // Set fast to slow.
if (label1.BackColor == Color.Red)
label1.BackColor = Color.Transparent;
else
label1.BackColor = Color.Red;
}
}
使用 UI 计时器,不要为此任务休眠。你让主线程一直处于休眠状态,并且你正在阻止用户输入。使用 Thread.Sleep
几乎总是 表明您做错了什么。 Thread.Sleep
正确的情况很少。具体来说,让 UI 线程休眠是 永远不会 正确的。
在您的表单上放置一个 Timer
组件,并在 Tick
事件中,不断更改标签的背景颜色。
例如:
// Keeps track of the number of blinks
private int m_nBlinkCount = 0;
// ...
// tmrTimer is a component added to the form.
tmrTimer.Tick += new EventHandler(OnTimerTick);
m_nBlinkCount = 0;
tmrTimer.Interval = 1000; // 1 second interval
tmrTimer.Start();
// ...
private void OnTimerTick ( Object sender, EventArgs eventargs)
{
if (label1.BackColor == Color.Red)
label1.BackColor = Color.Transparent;
else
label1.BackColor = Color.Red;
m_nBlinkCount++;
if ( m_nBlinkCount >= 10 )
tmrTimer.Stop ();
}
这里发生的事情是您正在休眠 GUI 线程,这导致程序挂起。 GUI 线程也是负责更改标签背景颜色的线程。
这里有一个简单的实现,可以为您解决这个问题。请注意,这不是可能的最佳实现,但它使用了您首选的闪烁代码实现。对于比 Thread.Sleep 更好的选择,请参阅 System.Timers.Timer 或者,如 xxbbcc 所建议的,System.Windows.Forms.Timer.
BackgroundWorker blinker;
public Form1()
{
InitializeComponent();
blinker = new BackgroundWorker();
blinker.DoWork += blinker_DoWork;
}
private void blinker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000); // Set fast to slow.
if (label1.InvokeRequired)
{
label1.Invoke((Action)blink);
}
else
{
blink();
}
}
}
private void blink()
{
if (label1.BackColor == Color.Red)
label1.BackColor = Color.Transparent;
else
label1.BackColor = Color.Red;
}
private void button1_Click(object sender, EventArgs e)
{
if (blinker.IsBusy == false)
{
blinker.RunWorkerAsync();
}
}
我有一个 winform 应用程序,我需要使标签背景颜色闪烁。我正在尝试使用 for 循环和 Thread.Sleep 来做到这一点,但不起作用。感谢您的帮助和建议:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000); // Set fast to slow.
if (label1.BackColor == Color.Red)
label1.BackColor = Color.Transparent;
else
label1.BackColor = Color.Red;
}
}
使用 UI 计时器,不要为此任务休眠。你让主线程一直处于休眠状态,并且你正在阻止用户输入。使用 Thread.Sleep
几乎总是 表明您做错了什么。 Thread.Sleep
正确的情况很少。具体来说,让 UI 线程休眠是 永远不会 正确的。
在您的表单上放置一个 Timer
组件,并在 Tick
事件中,不断更改标签的背景颜色。
例如:
// Keeps track of the number of blinks
private int m_nBlinkCount = 0;
// ...
// tmrTimer is a component added to the form.
tmrTimer.Tick += new EventHandler(OnTimerTick);
m_nBlinkCount = 0;
tmrTimer.Interval = 1000; // 1 second interval
tmrTimer.Start();
// ...
private void OnTimerTick ( Object sender, EventArgs eventargs)
{
if (label1.BackColor == Color.Red)
label1.BackColor = Color.Transparent;
else
label1.BackColor = Color.Red;
m_nBlinkCount++;
if ( m_nBlinkCount >= 10 )
tmrTimer.Stop ();
}
这里发生的事情是您正在休眠 GUI 线程,这导致程序挂起。 GUI 线程也是负责更改标签背景颜色的线程。
这里有一个简单的实现,可以为您解决这个问题。请注意,这不是可能的最佳实现,但它使用了您首选的闪烁代码实现。对于比 Thread.Sleep 更好的选择,请参阅 System.Timers.Timer 或者,如 xxbbcc 所建议的,System.Windows.Forms.Timer.
BackgroundWorker blinker;
public Form1()
{
InitializeComponent();
blinker = new BackgroundWorker();
blinker.DoWork += blinker_DoWork;
}
private void blinker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000); // Set fast to slow.
if (label1.InvokeRequired)
{
label1.Invoke((Action)blink);
}
else
{
blink();
}
}
}
private void blink()
{
if (label1.BackColor == Color.Red)
label1.BackColor = Color.Transparent;
else
label1.BackColor = Color.Red;
}
private void button1_Click(object sender, EventArgs e)
{
if (blinker.IsBusy == false)
{
blinker.RunWorkerAsync();
}
}