如何将自定义事件处理程序发送到此类

本文关键字:程序 自定义 事件处理 | 更新日期: 2023-09-27 18:32:22

所以在 gtk sharp 中有这个类:

http://docs.go-mono.com/?link=E%3aGtk.Button.Clicked

它接受事件处理程序类型的事件。我想使用将字符串传递给它调用的函数的自定义事件处理程序。

问题是,我似乎无法将我的自定义事件处理程序提供给它。即使我在其定义中使用事件处理程序作为抽象类。

为什么我做不到?我想我错过了一些明显的东西...

编辑,我的代码:

public MainWindow () : base (Gtk.WindowType.Toplevel)
{
    Button button = new Button ("button");
    button.Clicked += new EventHandler(my_function);
    this.Add (button);
    Build ();
}
static void my_function(object obj, EventArgs args){
        //some code
}

我尝试将新的EventHandler更改为MyEventHandler(my_function,MyCustomArghs),但无论我尝试哪种组合,总会有一些错误。主要与尝试强制转换为类型事件处理程序有关 - 事件,尽管 MyEventHandler 是 EventHandler 类的子级。

如何将自定义事件处理程序发送到此类

订阅事件的事件处理程序必须符合 C# 的委托类型规则。特别是,虽然你可以"扩大"论点,但你不能"缩小"它们。即,您的参数可以是实际特定于委托的参数类型的基类型,但它们不能是它们的派生类。

您没有具体说明您将在自定义EventArgs类中实际放置什么。但是,处理此类方案的常用方法是将事件处理程序方法包装在与委托类型匹配的匿名方法中,使用匿名方法作为适配器。

例如:

public MainWindow () : base (Gtk.WindowType.Toplevel)
{
    Button button = new Button ("button");
    button.Clicked += (sender, e) => my_function("some string literal");
    this.Add (button);
    Build ();
}
static void my_function(string text){
        //some code
}

请注意,采用此方法时,实际事件处理程序根本不需要具有与实际事件签名类似的任何内容。您只需要能够编写使实际事件参数适应处理程序将采用的代码所需的任何代码。如果你想完全忽略事件的实际参数,只传递其他东西,你可以。