这是一段示例代码来演示该问题。我为时间成本函数DoSomething
启动了BackGroundWorker。
首先禁用按钮。然后,工人开始工作。最后,工作完成后,将重新启用该按钮。
BackgroundWorker w = new BackgroundWorker();
/* Disable the button at first */
Button.Enabled = false;
w.WorkerReportsProgress = false;
w.WorkerSupportsCancellation = false;
w.DoWork += new DoWorkEventHandler((s, e) =>
{
DoSomething(); // It may take 10 ms to 10 s
});
w.RunWorkerCompleted += new RunWorkerCompletedEventHandler((s, e) =>
{
/* Enable the button finally */
Button.Enabled = true;
});
w.RunWorkerAsync();
但是,在某些情况下,时间成本函数DoSomething
可能会立即返回。然后,禁用和启用按钮可能会导致按钮闪烁。可以看到,设置Disable
和Enable
会强制重绘Button。
甚至:
private void AnotherButton_Clicked(object sender, EventArgs e)
{
for (int i = 0; i < 40; i++)
{
Button.Enabled = false;
Button.Enabled = true;
}
}
引起闪烁(请尽快按下按钮)。是否有更好的解决方案可以减少由启用和禁用引起的按钮闪烁问题?