从帮助程序类重写Control的事件

时间:2014-09-20 14:25:03

标签: c# events controls override

我知道当我将Control子类化时,我可以选择覆盖事件或订阅它:

public class myPanel : Panel 
{
    public myPanel()
    {
        this.Paint += myPanel_Paint;
    }

    void myPanel_Paint(object sender, PaintEventArgs e)
    {
        //
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }

}

我的问题是关于子类化,但关于创建一个可以注册常规控件实例的辅助类。现在我可以订阅它的活动:

class DrawCtl
{
   public Control CTL { get; set;}

public DrawCtl(Control Ctl) 
{
    CTL = Ctl;
    CTL.MouseMove += CTL_MouseMove;
}

void CTL_MouseMove(object sender, MouseEventArgs e)
{
    //
}

我想知道的是:是否也可以从助手类override召开一个控制事件?

2 个答案:

答案 0 :(得分:2)

不,您不能"覆盖事件",只能在基类中的虚方法上覆盖。事件的重点是 exact ,打破了类之间的这种依赖关系。它强有力地支持.NET的基于组件的编程模型。最大的好处是任何类都可以订阅该事件。你不必了解,也不必提供。

他们确实有缺点,他们很容易打破你的课程。你授权其他代码搞乱你的绘画。当然,这不是你的错误,你可能会得到关于它的支持电话:)

这也是你应该总是覆盖你的类中的OnPaint(),从不使用Paint事件的原因。因为现在你真的想要耦合并控制,减少事故发生的几率。你有决定,你应该坚持下去,这样你的控制就可以预测。您必须做出的选择是何时调用base.OnPaint()。

你有四个选择。首先调用它,然后自己绘画。让你成为老板,你的油漆总是在上面。或者做自己的绘画,然后调用base.OnPaint()。将接力棒交给客户代码和友好的"以组件为导向的方式。或者放下脚,根本不要打电话。所以没有Paint事件处理程序可以搞砸它。最终的武器,声明它密封所以没有人可以覆盖你的OnPaint()方法。从来没有这么惊讶:)

答案 1 :(得分:1)

OnPaint方法通常为protected;所有OnXXX事件方法也都是protected。您可以override并仅在派生类中使用它;所以你不能在帮助类中做到这一点......