如何给Click事件传递自定义的参数
有一种方法是在Button的Tag属性设置为你要传入的参数,一般不建议这么做,当然也不失为一种简单粗暴的好办法
为什么写这个是因为: 一开始我就是用具名函数的形式绑定Click事件的
原因是慎用匿名函数
匿名函数会产生很多内存泄漏的问题,因为你不小心就会捕获了各种变量甚至是一些全局静态变量
但是如果想传入自定义参数的话,那么第二种方式是不可以的
其余的方式只能通过lamada表达式来实现了
代码如下:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Button button1 = new Button();
this.Content = button1;
string ParamStr = "自定义参数";
//第一种方式:匿名函数 直接捕获局部变量
button1.Click += (sender, e) =>
{
MessageBox.Show(ParamStr);
};
//第二种方式:不行,具名函数无法获得局部变量
button1.Click += Button1_Click;
//第三种方式:也是匿名函数,匿名中包含具名函数,然后通过传参来实现
//(sender, e) => MyButton1_Click(ParamStr) 这个整体就是一个匿名函数
//本质上也是捕获,捕获了this和ParamStr
button1.Click += (sender, e) => MyButton1_Click(ParamStr);
//第四种方式:跟第三种一样,也是匿名函数,匿名中包含具名函数,然后通过传参来实现
//只不过多了一步,定义了一个delegate
RoutedEventHandler handler =(sender,e)=>MyButton1_Click(ParamStr);
button1.Click += handler;
}
private void Button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(ParamStr);//报错,当前上下文不存在ParamStr
}
private void MyButton1_Click(String param)
{
MessageBox.Show(param);
}
}
第二种方式是行不通的,其他三种方式本质上都是捕获了局部变量
将鼠标移动至=>上 会提示已捕获
如下: