我确定这很容易理解,但我不能这样做。我在Label
内有一个3 Panel
的winform。加载表单时,第一个Label
有一个Paint
事件,在其上绘制一个矩形。我希望backgroundWorker
遍历每一个,等待5秒,将Label
恢复正常(重绘我猜测),然后在以下Label
上绘制一个矩形。
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
或其他东西。如果可能的话,我想要一些建议。
答案 0 :(得分:1)
这实际上是由于您使用了8像素的笔宽,我相信。尝试不同的尺寸,看看是否会改变未绘制的矩形的大小。
要填充矩形,请使用:
e.Graphics.FillRectangle(new SolidBrush(Color.DeepPink), e.ClipRectangle);
编辑由于您现在完全负责绘制控件,因此可以使用DrawString调用重新绘制文本:
e.Graphics.DrawString(label.Text, label.Font, SystemBrushes.ControlText, new PointF(0,0));
编辑以下是如何嵌套面板和标签以实现您的目标:
虽然我一直喜欢做自己绘制的东西,但有时它更容易使用那里的东西!但是为了好玩,我会将它包装成一个新的Panel派生控件,以便于重用。