为 RoutedEventHandler 使用 Lambda 表达式

Using Lambda Expressions for RoutedEventHandler

我正在使用以下代码成功安装事件处理程序:

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

它给我错误信息:

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type.

我不知道应该怎么做。有可能吗?

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