我有点困惑。我知道我可以创建派生自EventArgs的类,以便拥有自定义事件数据。但我可以以某种方式使用基类EventArgs吗?与鼠标按钮一样,在订阅者方法中,始终存在“EventArgs e”参数。我可以以某种方式创建以这种方式传递数据的方法,我的意思是它们将在基础Eventargs中传递吗?
答案 0 :(得分:15)
您可以通过Generic Types方法使用EventArgs类。在此示例中,我将使用带有返回类型的Rect类:
public EventHandler<Rect> SizeRectChanged;
举起活动:
if(SizeRectChanged != null){
Rect r = new Rect(0,0,0,0);
SizeRectChanged(this,r);
}
倾听活动:
anyElement.SizeRectChanged += OnSizeRectChanged;
public void OnSizeRectChanged(object sender, Rect e){
//TODO abything using the Rect class
e.Left = e.Top = e.Width = e.Height = 50;
}
因此,不需要创建新的事件类或委托,只需创建一个传递特定类型T的EventHandler。
答案 1 :(得分:6)
不。 EventArgs基类只是一种允许某些标准事件委托类型的方法。最终,要将数据传递给处理程序,您需要子类化EventArgs。您可以使用发送方arg,但这应该是触发事件的对象。
答案 2 :(得分:3)
是否可以只使用EventArgs
数据类型raw?绝对。根据MSDN:
此类不包含任何事件数据;它是由引发事件时未将状态信息传递给事件处理程序的事件使用的。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。
http://msdn.microsoft.com/en-us/library/system.eventargs.aspx
private event TestEventEventHandler TestEvent;
private delegate void TestEventEventHandler(EventArgs e);
private void button1_Click(object sender, EventArgs e)
{
TestEvent += TestEventHandler;
if (TestEvent != null)
{
TestEvent(new EventArgs());
}
}
private void TestEventHandler(EventArgs e)
{
System.Diagnostics.Trace.WriteLine("hi");
}
你应该这样做吗?我无论如何都不会想到。如果您想创建自己的点击,您也可以自己实例化MouseEventArgs
:
MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1);