C# 为什么我能';t在C中直接通过RoutedEventHandler#
我获得了一个UserControl,希望事件在其中公开: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()
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
(与您尝试使用它的班级相同)?