[英]How is an event parameter passed?
我在C#中注意到我可以覆盖Form()父类中的方法,如下所示:
protected override void OnPaint(PaintEventArgs e)
{
}
我不明白如何生成PaintEventArgs
以及如何/何时将其传递给此函数。 我必须假设每次表单需要重新绘制时都会调用OnPaint()
。
此外,当我创建按钮按事件时,它们看起来像这样:
private void button1_Click(object sender, EventArgs e)
{
}
再次,我不明白激活按钮点击时这些参数是如何/为什么传递的。
没什么特别的。 定义Paint
事件的基类包含与此在道德上等价的代码:
protected virtual void OnPaint(PaintEventArgs e)
{
var paintHandlers = this.Paint;
if (paintHandlers != null)
{
paintHandlers(this, e);
}
}
OnPaint
两个功能:
Paint
事件,以便通知外部订阅者(这是假设的form1_Paint
最终将被调用的方式)。 当提出Paint
事件的时候,基类中的一些其他代码根据手头的信息创建一个PaintEventArgs
实例并调用OnPaint
:
// ...somewhere in the class...
OnPaint(new PaintEventArgs(...));
在将event参数类型化为EventArgs
的特殊情况下,无需创建新实例,您可以直接将EventArgs.Empty
静态成员传递给OnSomething
方法。
至于何时发生这种情况:每当从应用程序的消息泵中抽取消息并进行处理时,就表明应该引发该事件。 您可能还想阅读C#中的了解事件和事件处理程序 。
最好的起点是(重新)熟悉.Net“代表”:
例如,如果您查看C#表单的代码,您可能会看到如下内容:
private void btnGo_Click(object sender, EventArgs e)
{
// My code goes here...
现在,如果您查看相应的自动生成的.Design代码,您会看到如下内容:
private void InitializeComponent()
{
this.btnGo.Click += new System.EventHandler(this.btnGo_Click);
....
“+ =”语法将自定义事件处理程序分配给按钮。 任何关于“代表”的教程( 包括我上面引用的链接)都会为您提供有关其工作原理和原因的更多详细信息。
我希望有帮助.. PSM
对于按钮单击事件处理程序, object sender, EventArgs e
语法允许将多个按钮连接到单个事件处理程序。 这是可能的,因为sender
是发起事件的对象,因此您可以区分button1,button2或button3是否启动了事件。
而且由于sender
是一个object
,那么你可以想象有一个单击处理程序来处理所有可点击的页面元素,并在处理程序中有一堆条件逻辑,根据启动事件的控件类型进行切换; 不建议这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.