我确定这是非常容易弄清楚的事情,但我无法做到。我在Panel
中有一个3 Label
的winform。当表单加载时,第一个Label
有一个Paint
事件,在该事件上绘制一个矩形。我想要一个backgroundWorker
通过每一个,等待5秒,恢复Label
正常(重新绘制我猜),然后在以下Label
上画一个矩形。C#标签突出显示并删除突出显示
public List<Label> GetLabelList()
{
return new List<List>()
{
label1,
label2,
label3,
label4
};
}
private void bgBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
var getList = GetLabelList();
for (int i = 0; i < getList.Count; i++)
{
if ((bgBackgroundWorker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
Thread.Sleep(5000);
getList [i].Paint += RemoveLabelHighlight;
getList [i].Invalidate();
if (i < 2)
{
getList [i + 1].Paint += AddLabelHighlight;
getList [i + 1].Invalidate();
}
bgBackgroundWorker.ReportProgress((i * 10));
}
}
}
private void AddLabelHighlight(object sender, PaintEventArgs e)
{
var label = sender as Label;
e.Graphics.DrawRectangle(new Pen(Color.DeepPink, 8), label.ClientRectangle);
}
private void RemoveLabelHighlight(object sender, PaintEventArgs e)
{
var label = sender as Label;
e.Graphics.DrawRectangle(new Pen(Color.Green, 8), label.ClientRectangle); // This should return the Label back to original state
}
这有效,但是当绘制矩形时,标签会一直切断。有什么建议么?
此外,我敢肯定,有一个更好,更有效的方式来实现这一点,也许通过EventHandler
什么的。如果可能,我想提出一些建议。
据我了解,用户最初会看到3个标签。第一个标签由矩形覆盖。 5秒后,矩形被删除,并在第二个标签上绘制一个新的矩形,等等等等? –
为什么在你可以使用'Timer'的时候,你会使用'BackgroundWorker'并调用'Thread,Sleep'? – jmcilhinney
我不确定Invalidate()是否是线程安全的,但是根据从后台线程访问UI控件的经验法则不是一个好主意。我只是使用Timer来做到这一点,但如果您必须使用backgroundWorker,那么请在ReportProgress事件处理程序中执行UI处理,该处理程序在UI线程上运行。 – smead