我確定這是非常容易弄清楚的事情,但我無法做到。我在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