[100分]C# 如何向事件的回调函数中传递参数?

2025-03-24 12:08:14
推荐回答(5个)
回答1:

Click事件用户无法自主调用(都是由系统调用的),即便能传递参数,你又如何传进去呢?
RoutedEventHandler委托已经第二个参数是事件参数,如果你需要自定义事件,可以用EventHandler或扩展EventHandler重新定义事件,

那要怎样取消匿名函数的订阅呢?
匿名方法无法取消订阅,如果你需要取消订阅的功能,使用命名方法,

回答2:

需要明白的概念是VC中的回调函数在C#中是用委托的方式实现,两者都是调用函数的规范,表示了调用本函数会有什么参数和返回值,事件是用委托签名的函数,因为事件就有与签名函数一样的参数和返回值,事件有WINDOWS时间和自定义事件,其根本解决的问题就是当系统或对象内部产生消息后,需要由外部进行处理而产生的外部调用机制,明白了原理,你才能明白他的运作机制,就自然明白他为什么这样,为什么不能那样。。。

回答3:

如果单纯想要传递参数,不需要固定在这个层面的方法。
你可以再定义一个方法Public void MyBtn_Click(Object sender, RoutedEventArgs e,String mystr)
然后再在btn_Click 方法中调用自己的方法。
MyBtn_Click(sender, e,mystr);

如果你做的基类,那就要继承EventArgs类,自定义一个参数类型。

回答4:

个人想法,你的btn不是孤立的,它是作为一个窗体里的对象存在的
那么你是不是可以通过btn.Form之类的方法获取到这个窗体,从而获取到窗体里的相应属性之类
如果不是公共的,可以通过反射来实现

RoutedEventHandler事件的参数是已经固定了的,就是Object sender, RoutedEventArgs e
所以你无法增加你需要的参数,
不过这个sender,就是触发事件的对象,也就是那个btn,你可以变通一下,给那个btn的某些属性赋值成你希望传递的参数,比如btn.Text = 参数

然后在:btn_Click方法里,把sender转换为btn对象,并获取text属性

回答5:

public class MyButton:Button
{
string str = "事件里边要用的数据";
}

然后,你的按钮从自定义类myButton声明和实例化.
MyButton button1 = new MyButton();
button1.str = "更改数据"

事件里边,就可以通过sender访问按钮的自定义成员了
string str = ((myButton)sender).str

至于Lambda 表达式,
如果你直接btn.Click += Lambda 表达式,那么,这个Lambda 表达式的地址对我们来说是未知的,
就像System.Console.WriteLine("我是个字符串,你能找到我吗");里边的字符串一样.
并且,编译器不允许我们这么清空Click: btn.Click = btn.Click - btn.Click(Click只能用于-= +=的左边)

你可以先为Lambda 表达式声明个全局RoutedEventHandler,然后在用的时候先用Lanbda实例化表达式到变量,之后Click事件对这个变量操作就好.
RoutedEventHandler reh;
reh = new EventHandler(
(sender_button1, e_button1) =>
{
((MyButton)sender_button1).Text =((MyButton)sender_button1).str;
} );

btn.Click += reh;
btn.Click -= reh;