繁体   English   中英

如何传递事件参数?

[英]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两个功能:

  1. 引发Paint事件,以便通知外部订阅者(这是假设的form1_Paint最终将被调用的方式)。
  2. 让派生类直接响应绘制事件而不需要涉及事件处理程序 - 只需覆盖方法(但派生类不能忘记调用基本实现!)。

当提出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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM