我有点困惑.我知道我可以创建派生自EventArgs的类,以便拥有自定义事件数据.但我可以以某种方式使用基类EventArgs吗?与鼠标按钮一样,在订阅者方法中,始终存在"EventArgs e"参数.我能以某种方式创建以这种方式传递数据的方法,我的意思是它们将在基础Eventargs中传递吗?
jup*_*upi 15
您可以通过Generic Types方法使用EventArgs类.在此示例中,我将使用Rect类作为返回类型:
public EventHandler<Rect> SizeRectChanged;
Run Code Online (Sandbox Code Playgroud)
举办活动:
if(SizeRectChanged != null){
Rect r = new Rect(0,0,0,0);
SizeRectChanged(this,r);
}
Run Code Online (Sandbox Code Playgroud)
听取活动:
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;
}
Run Code Online (Sandbox Code Playgroud)
因此,不需要创建新的事件类或委托,只需创建一个传递特定类型T的EventHandler.
不.EventArgs基类只是一种允许某些标准事件委托类型的方法.最终,要将数据传递给处理程序,您需要子类化EventArgs.您可以使用发送方arg,但这应该是触发事件的对象.
是否可以只使用EventArgs原始数据类型?绝对地。根据 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");
}
Run Code Online (Sandbox Code Playgroud)
你应该这样做吗?没有任何理由我能想到。如果您想创建自己的点击,您MouseEventArgs也可以自己实例化:
MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27533 次 |
| 最近记录: |