当我点击例如按钮时一个WinForms应用程序,什么信息传递给事件方法的 EventArgs e ?我只是想知道,因为我使用作为关键字"转换" e 指向鼠标事件,以获取点击按钮的点的坐标。
编辑: 在下面的示例中,我可以将变量 e 转换为MouseEventArgs类型的对象,并且我想知道可以转换哪些其他类型的事件参数 e 。 / p>
private void someEvent(object sender, EventArgs e)
{
int xCoord = (e as MouseEventArgs).X;
}
答案 0 :(得分:1)
这取决于事件,大多数winforms事件的基础窗口消息没有这样的概念,因此创建EventArgs的地方将决定它包含的类型和信息。它可能是来自框架的东西,或者你可以组成自己的派生自EventArgs的类。
在.Net4.5之后,它甚至不必派生自EventArgs
答案 1 :(得分:1)
你应该使用System.Windows.Forms.Cursor.Position
:“一个代表光标在屏幕坐标中位置的点。”
答案 2 :(得分:1)
有两个参数:发件人和EventArgs。发件人是初始化事件的对象。 EventArgs包含有关该事件的其他信息。
来自MSDN
// This example uses the Parent property and the Find method of Control to set
// properties on the parent control of a Button and its Form. The example assumes
// that a Button control named button1 is located within a GroupBox control. The
// example also assumes that the Click event of the Button control is connected to
// the event handler method defined in the example.
private void button1_Click(object sender, System.EventArgs e)
{
// Get the control the Button control is located in. In this case a GroupBox.
Control control = button1.Parent;
// Set the text and backcolor of the parent control.
control.Text = "My Groupbox";
control.BackColor = Color.Blue;
// Get the form that the Button control is contained within.
Form myForm = button1.FindForm();
// Set the text and color of the form containing the Button.
myForm.Text = "The Form of My Control";
myForm.BackColor = Color.Red;
}
答案 3 :(得分:0)
我正在使用as关键字将“转换”为鼠标事件
不要这样做。为什么呢?
因为如果有人使用键盘(TABs + Enter)或Button.PerformClick来触发您的按钮,则转换将失败并且您的:
MouseEventArgs mouseArgs = e as MouseEventArgs ;
if (mouseArgs.MouseButton == MouseButton.Left) ...
将导致NullReferenceException
。
您不能保证EventArgs e
事件中的OnClick
是MouseEventArgs。这只是最常见的情况,但不是唯一可能的情况。
P.S。:正如@terribleProgrammer已经指出的那样,您可以使用Cursor.Position静态属性以更独立,更健壮的方式获取当前光标位置。
但是如果光标信息只有在按钮被鼠标触发时才有意义,那么您只需要小心并处理可能的转换失败:
MouseEventArgs mouseArgs = e as MouseEventArgs ;
if (mouseArgs == null)
{
Logger.Log("mouseArgs is null");
return;
}
if (mouseArgs.MouseButton == MouseButton.Left) ...
修改强>
有三种主要方法可以引发事件,还有三种相应的eventArgs类:
MouseEventArgs
KeyEventArgs
PerformClick
方法 - 我不确定,但它可能只是简单EventArgs
(以验证只是以这种方式提升它并看一下e.GetType())。 P.S.1。:我想再次重复 - 不要假设e
参数属于某种特定类型。 Windows Forms API甚至不保证e将包含一些具体有用的EventArgs
派生类。