何时覆盖以及何时订阅委托?

时间:2014-05-24 09:21:38

标签: c# .net events delegates

我在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方法。

但最好使用哪一个?

谢谢

3 个答案:

答案 0 :(得分:4)

首选方法是覆盖OnPaint方法,而不是注册到Paint事件。这样您就不会将delegatePaint控件绑定。

来自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}} ;重新决定实例的外观。