我在C#中注意到我可以通过几种不同的方式处理事件,但我不确定哪一种最适合使用,请看这里:
this.Paint += Form1_Paint;
void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}
或
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}
当然这些都会产生相同的结果,而OnPaint()
通常会(如果我没有改变它)只是通过委托来调用Form1_Paint
方法。
但最好使用哪一个?
谢谢
答案 0 :(得分:4)
首选方法是覆盖OnPaint方法,而不是注册到Paint
事件。这样您就不会将delegate
与Paint
控件绑定。
来自MSDN:
引发事件通过委托调用事件处理程序。有关更多信息,请参阅处理和引发事件。 OnPaint方法还使派生类能够在不附加委托的情况下处理事件。这是在派生类中处理事件的首选技术。
对继承人的说明: 在派生类中重写OnPaint时,请务必调用基类的OnPaint方法,以便已注册的委托接收事件。
答案 1 :(得分:1)
这两种方法不相同。
可以在调用OnPaint
方法的地方编写代码,但不能激活Paint
方法。
事实上,您在问题中编写的代码就是这种情况。
您的代码缺少实际触发事件的base.OnPaint(e);
调用:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}
所以你真的应该决定你的行为是否会因为选择其中一个而受到影响。
然而,正确编写的所有代码的99.999%没有区别。
答案 2 :(得分:1)
简单,OnPaint
重写方法适用于我自己(我的意思是控件或表单本身)。例如:如果您想要更改控件的外观,则可以在OnPaint
重写方法中执行此操作。
Paint
活动适用于其他人,我的意思是,一旦你决定看看你的控制但它在某些地方不合适,你想让它变得更好你会做到这一点订阅Paint
活动。
换句话说:当您决定键入自身的外观时,应使用OnPaint
,而当您使用Paint
事件时应使用{{1}} ;重新决定实例的外观。