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

时间:2014-10-14 02:53:06

标签: c# wpf

这适用于在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

对不起,我是新手,不知道应该怎么做。这甚至接近了吗?谢谢!

2 个答案:

答案 0 :(得分:3)

只要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 }));

老实说,我认为我从未使用过这种语法。

似乎是in most cases it does the same thing。根据{{​​3}}文档,handledEventsToo方法上有一个AddHandler()参数,我认为这可能很重要。

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

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);

答案 1 :(得分:1)

尝试使用此逻辑为您的复选框附加Click事件处理程序。

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


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