C# 为什么我能';t在C中直接通过RoutedEventHandler#

C# 为什么我能';t在C中直接通过RoutedEventHandler#,c#,events,routed-events,C#,Events,Routed Events,我获得了一个UserControl,希望事件在其中公开: public event RoutedEventHandler CloseButtonClicked; 但要发送到此事件,以下不起作用: public MyUserControl() { InitializeComponent(); closeButton.Click += CloseButtonClicked; } public MyUserControl() { InitializeComponent()

我获得了一个UserControl,希望事件在其中公开:

public event RoutedEventHandler CloseButtonClicked;
但要发送到此事件,以下不起作用:

public MyUserControl()
{
    InitializeComponent();

    closeButton.Click += CloseButtonClicked;
}
public MyUserControl()
{
    InitializeComponent();

    closeButton.Click += (sender, args) => CloseButtonClicked(sender, args);
}
而以下方法确实有效:

public MyUserControl()
{
    InitializeComponent();

    closeButton.Click += CloseButtonClicked;
}
public MyUserControl()
{
    InitializeComponent();

    closeButton.Click += (sender, args) => CloseButtonClicked(sender, args);
}

这是为什么?

当关闭按钮时,这一行没有告诉要执行什么。单击发生:

closeButton.Click += CloseButtonClicked;
将实际方法融入其中。您需要先设置CloseButtonClicked:

CloseButtonClicked += MyMethodWhichDoesSomething;
现在创建方法MyMethodWhichDoesSomething并在那里引发事件(CloseButtonClicked(sender,e);)

这一行的作用是,它实际上创建了一个引发事件的方法

closeButton.Click += (sender, args) => CloseButtonClicked(sender, args);

这两种情况的不同之处在于对
CloseButtonClicked
事件进行评估时

在第一个非工作示例中,事件字段的值在程序语句
closeButton.Click+=closeButton单击时计算被执行。除非您已经将该字段设置为一些有用的值,否则稍后当引发
Click
事件时,将不会发生任何事情

在第二个工作示例中,在引发Click事件时计算event字段的值。该语句声明了一个匿名方法(通过lambda表达式),该方法在执行时调用存储在
CloseButtonClicked
事件字段中的委托实例。因此,只要在引发事件之前设置了该字段,执行
closeButton.Click+=(发送方,args)=>CloseButtonClicked(发送方,args)时未设置该字段并不重要语句

请注意,如果在引发
Click
事件时未初始化
CloseButtonClicked
事件字段,则即使是第二条语句也会失败,并出现NullReferenceException。在引发事件时,您应该首先检查null以防止出现这种情况(最好通过将值保存到本地first来防止任何线程争用情况)。例如:

closeButton.Click += (sender, args)
{
    RoutedEventHandler handler = CloseButtonClicked;

    if (handler != null)
    {
        handler(sender, args);
    }
};

当然,上面的样板文件通常被封装到一个helper方法(扩展或其他)中。

您能显示
CloseButtonClicked
方法的声明吗?@edchape它位于我问题的第二行。
CloseButtonClicked
事件真的在
MyUserControl
(与您尝试使用它的班级相同)?