为Windows窗体自定义控件定义事件。

5

我正在开发一个表单自定义控件。该控件类似于Visual Studio(C#)中的MonthCalendar控件,我想为我的控件定义一个新事件。 如何为这个表单自定义控件定义一个新事件?

2个回答

9

如果您的事件不需要提供任何附加信息(Foo是您的事件名称):

public event EventHandler Foo;

并按照以下方式提高它:

protected virtual void OnFoo()
{
    if (Foo != null)
        Foo(this, EventArgs.Empty);
}

如果您需要向事件处理程序传递一些附加信息,则通过继承自 EvenArgs 类创建自定义参数类。
public class FooEventArgs : EventArgs
{
    public string Message { get; private set; }

    public FooEventArgs(string message)
    {
        Message = message;
    }
}

这样声明事件:

public event EventHandler<FooEventArgs> Foo;

这样提高它:

protected virtual void OnFoo(string message)
{
   if (Foo != null)
       Foo(this, new FooEventArgs(message));
}

在声明事件的类的后代中创建受保护方法来触发事件是一个良好的实践。同时,使用事件命名约定也是一个好的实践:

  • 对于在某些事情发生之前引发的事件(通常可以取消此类事件),将事件名称添加后缀“-ing”(例如,Validating)
  • 对于在某些事情发生后引发的事件,将事件名称添加后缀“-ed”(例如,Clicked)

正如Thorsten所说,创建虚拟方法来触发事件是一种良好的做法。这不仅允许从后代中引发事件,还可以禁用事件的引发或在事件引发之前/之后添加某些行为。


1
此外,最佳实践是通过名为 OnXXXprotected virtual void 方法触发事件,其中 XXX 是您的事件名称。在上面的示例中:protected virtual void OnFoo(...) - Thorsten Dittmar
@ThorstenDittmar 没错!是我犯了错误——在示例中忘记了 virtual 关键字。 - Sergey Berezovskiy

0
public event EventHandler<EventArgs> YourEvent;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接