将方法传递给C#WPF中的事件处理程序

本文关键字:事件处理 程序 C#WPF 方法 | 更新日期: 2023-09-27 18:26:27

这适用于在C#WPF 中添加事件处理程序

CheckBox ifPrint = new CheckBox();
ifPrint.AddHandler(CheckBox.ClickEvent, new RoutedEventHandler(
(sender, e) => //toggle check box event
{
    //do stuff
}));

但是当方法体变长时,它看起来很乱,所以我想在其他地方定义这个方法,比如这个

ifPrint.AddHandler(CheckBox.ClickEvent, delegate(object sender, RoutedEventArgs e){
    checkBoxClick(sender, e);
});
private void checkBoxClick(object sender, RoutedEventArgs e)
{
//do stuff
}

但这甚至没有编译错误:Cannot convert anonymous type to type 'System.Delegate' because it is not a delegate type

对不起,我是新手,不知道该怎么做。这还差吗?谢谢

将方法传递给C#WPF中的事件处理程序

您可以订阅这样一个单独的方法,只要checkBoxClick的签名是正确的:

ifPrint.Click += checkBoxClick;

您还可以订阅一个内联事件,如下所示:

ifPrint.Click += (s, e) => SomeMethod();

这样你就可以将你的方法命名为更合理的名称,而不需要它接受参数:

private void SomeMethod()
{
    //do stuff
}

只是为了进一步解释一下,在上面的代码中,se代替了checkBoxClick事件方法中的参数,所以它基本上等价于:

ifPrint.Click += checkBoxClick;
private void checkBoxClick(object sender, RoutedEventArgs e)
{
    SomeMethod();
}

编辑,关于您的评论

考虑到这要简单得多,如果有的话,应该在什么时候使用它?ifPrint.AddHandler(CheckBox.ClickEvent, new RoutedEventHandler( (sender, e) => { //do stuff }));

老实说,我想我从来没有使用过这种语法。

似乎在大多数情况下,它都会做同样的事情。根据MSDN文档,AddHandler()方法上有一个handledEventsToo参数,我认为这可能很重要。

想象一下,您多次订阅一个活动,如下所示:

ifPrint.Click += checkBoxClick;
ifPrint.Click += checkBoxClick;
ifPrint.Click += checkBoxClick;

在您的活动中,您设置了e.Handled = true。如果你没有这行,你会看到消息框显示3次。但对于这行,您只会得到一次消息框,因为第一次触发事件时,它会将事件标记为"已处理"。

private void checkBoxClick(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Clicked!");
    e.Handled = true;
}

通过为最后一个参数传递true(默认情况下为false),实际上您告诉它激发该事件,即使其他事件已经"处理"了该事件

ifPrint.AddHandler(CheckBox.ClickEvent,
    new RoutedEventHandler((s, e) => { /* do stuff */ }), true);

尝试此逻辑为复选框附加点击事件处理程序。

CheckBox ifPrint = new CheckBox();
ifPrint.Click+=checkBoxClick;

private void checkBoxClick(object sender, RoutedEventArgs e)
{
//do stuff
}