2017-08-04 71 views
0

我正在尝试查看是否可以使用委托事件并重新使用它们,以便不必进行多次单击事件。现在,我有以下...在c中重用委托事件的正确方法#

namespace EventsWPF 
{ 

public partial class MainWindow : Window 
{ 
    public delegate void MyEvent(object sender, RoutedEventArgs e); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     btn1.Click += MyEvent; 
     btn2.Click += MyEvent; 
    } 


} 

}

这是做了正确的方法是什么?或者我在想这个错误的方式?我知道你可以使用Lambda表达式作为事件处理程序。但是如果我有多个事件,我不想为每个处理程序创建多个Lamda表达式,只需重新使用一个委托即可。

+2

这是否编译?如果不是,你会得到什么错误? – juharr

回答

1

是的,如果两个按钮应该有相同的逻辑运行;然后附上相同的处理程序是完美的罚款。您将无法通过附加delegate类型来完成此操作;你需要一个实际的方法(如@hoodaticus所描述的)。

如果这是WPF:

然而通常,两个按钮不这​​样做同样的事情,你不能摆脱这一点。更常见的是,两个按钮可以做同样的事情,但有不同的参数。不幸的是,WinForms风格的方法在这里会非常痛苦(你可以检查sender但是...... ewww)。

在这种情况下(实际上,在所有情况下),您确实想要利用MVVM模式并为按钮设置命令(而不是单击处理程序)。然后,您可以使用CommandParameter将自定义数据片段导入处理程序。

+0

我同意此问题的答案。如果在此上下文中重用lambda,则应通过ICommand包装器完成。但是,我不确定这个问题实际上是关于WPF的,它看起来像WPF只是一个例子。 – hoodaticus

+0

@hoodaticus够公平的;我的第一段除了WPF的具体情况,但 – BradleyDotNET

+0

好吧,这是有道理的。但不是Lambda函数的代表?我想我正在考虑的方式是,Lambda函数是代表方法的委托。所以在技术上,因为代表是方法,我应该能够将它们用作事件。这是错误的思考方式吗? – PandaLuna

1

MyEvent在这里是不必要的,因为你不是创建自己的事件,只是订阅别人的事件。关键字delegate声明方法签名和返回类型 - 它不创建实例或定义方法体。

这里是如何重新使用lambda表达式:

Action<object, RoutedEventArgs> myHandler = (o, e) => 
{ 
    /* write event handler code here, you must */ 
}; 

btn1.Click += myHandler; 
btn2.Click += myHandler;