为RoutedEventHandler使用Lambda表达式

时间:2015-01-31 11:50:15

标签: wpf

我使用此代码成功安装了事件处理程序:

this.AddHandler(MouseLeftButtonDownEvent, new RoutedEventHandler(tabLabel_MouseLeftButtonDown), true); ...
void tabLabel_MouseLeftButtonDown(object sender, EventArgs e)
{
    this.IsSelected = true;
 }

现在我尝试使用像这样的Lambda表达式使代码更紧凑:

this.AddHandler(MouseLeftButtonDownEvent, (s, e) => { this.IsSelected = true; }, true);

它给出了错误消息:

  

无法将lambda表达式转换为' System.Delegate'因为它不是委托类型。

我无法弄清楚应该怎么做。它有可能吗?

1 个答案:

答案 0 :(得分:4)

   this.AddHandler(MouseLeftButtonDownEvent, new RoutedEventHandler((sender,e) => this.IsSelected=true), true); 

问题出现是因为编译器知道AddHandler的第二个参数是System.Delegate类型,它是抽象的。没有具体类型,它无法推断lambda中参数的类型。

我们不必在这里使用RoutedEventHandler,我们可以创建具有相同签名的内容:Action<object,EventArgs>也可以使用,但上面的版本更短。

    this.AddHandler(MouseLeftButtonDownEvent,  new Action<object,EventArgs>((sender, e) => IsSelected = true), true);