我知道当我将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
召开一个控制事件?
答案 0 :(得分:2)
不,您不能"覆盖事件",只能在基类中的虚方法上覆盖。事件的重点是 exact ,打破了类之间的这种依赖关系。它强有力地支持.NET的基于组件的编程模型。最大的好处是任何类都可以订阅该事件。你不必了解,也不必提供。
他们确实有缺点,他们很容易打破你的课程。你授权其他代码搞乱你的绘画。当然,这不是你的错误,你可能会得到关于它的支持电话:)
这也是你应该总是覆盖你的类中的OnPaint(),从不使用Paint事件的原因。因为现在你真的想要耦合并控制,减少事故发生的几率。你有决定,你应该坚持下去,这样你的控制就可以预测。您必须做出的选择是何时调用base.OnPaint()。
你有四个选择。首先调用它,然后自己绘画。让你成为老板,你的油漆总是在上面。或者做自己的绘画,然后调用base.OnPaint()。将接力棒交给客户代码和友好的"以组件为导向的方式。或者放下脚,根本不要打电话。所以没有Paint事件处理程序可以搞砸它。最终的武器,声明它密封所以没有人可以覆盖你的OnPaint()方法。从来没有这么惊讶:)
答案 1 :(得分:1)
OnPaint
方法通常为protected
;所有OnXXX
事件方法也都是protected
。您可以override
并仅在派生类中使用它;所以你不能在帮助类中做到这一点......