这适用于在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
对不起,我是新手,不知道应该怎么做。这甚至接近了吗?谢谢!
答案 0 :(得分:3)
只要checkBoxClick
的签名正确无误,您就可以订阅这样的单独方法:
ifPrint.Click += checkBoxClick;
您还可以订阅内联事件,如下所示:
ifPrint.Click += (s, e) => SomeMethod();
然后,您可以使用更合理的方法命名方法,而不要求它接受参数:
private void SomeMethod()
{
//do stuff
}
为了进一步解释一下,在上面的代码中,s
和e
取代了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
}