对 RoutedEventHandler 使用 Lambda 表达式

Joh*_*cht 0 wpf

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

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

现在我尝试使用 Lambda 表达式使代码更加紧凑,如下所示:

this.AddHandler(MouseLeftButtonDownEvent, (s, e) => { this.IsSelected = true; }, true);
Run Code Online (Sandbox Code Playgroud)

它给了我错误消息:

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

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

arb*_*ary 5

   this.AddHandler(MouseLeftButtonDownEvent, new RoutedEventHandler((sender,e) => this.IsSelected=true), true); 
Run Code Online (Sandbox Code Playgroud)

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

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

    this.AddHandler(MouseLeftButtonDownEvent,  new Action<object,EventArgs>((sender, e) => IsSelected = true), true);
Run Code Online (Sandbox Code Playgroud)