c#按钮点击EventArgs信息

本文关键字:EventArgs 信息 按钮 | 更新日期: 2023-09-27 18:18:34

当我点击一个按钮在例如一个WinForms应用程序,什么信息被传递到事件方法的EventArgs e ?我只是想知道,因为我使用作为关键字来"转换"e到鼠标事件,以便获得单击按钮的点的坐标。

编辑:在下面的示例中,我可以将变量e转换为MouseEventArgs类型的对象,并且我想知道可以将e转换为哪些其他类型的事件参数。

private void someEvent(object sender, EventArgs e)
{
  int xCoord = (e as MouseEventArgs).X;
}

c#按钮点击EventArgs信息

这取决于事件,大多数winforms事件的底层windows消息没有这样的概念,所以无论在哪里创建EventArgs将决定它包含的类型和信息。它可以是来自框架的东西,或者你可以从EventArgs中派生出你自己的类。

在.Net4.5之后,它甚至不需要从EventArgs中派生

您应该使用System.Windows.Forms.Cursor.Position: "表示光标在屏幕坐标中的位置的点。"

有两个参数:一个sender和一个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;
}

我使用as关键字将e"转换"为鼠标事件

别这么做。为什么?

因为如果有人使用键盘(tab + Enter)或按钮。调用PerformClick来触发按钮,转换将失败,您的:

MouseEventArgs mouseArgs = e as MouseEventArgs ;
if (mouseArgs.MouseButton == MouseButton.Left) ...

将导致NullReferenceException

你不能保证OnClick事件中的EventArgs e将是MouseEventArgs。这只是最常见的情况,但不是唯一可能的情况。

注::因为它已经被@terribleProgrammer指向了,你可以使用Cursor。位置静态属性以更独立和健壮的方式获取当前光标位置。

但是,如果光标信息只有在按钮被鼠标触发时才有意义,那么您将不得不小心处理可能的转换失败:

MouseEventArgs mouseArgs = e as MouseEventArgs ;
if (mouseArgs == null)
{
    Logger.Log("mouseArgs is null");
    return;
}    
if (mouseArgs.MouseButton == MouseButton.Left) ...
编辑:

有三种主要的方法来引发事件和三个相应的eventArgs类:
  1. 使用鼠标- MouseEventArgs
  2. 使用键盘- KeyEventArgs
  3. 使用PerformClick方法-我不确定,但它可能只是普通的EventArgs(验证只是以这种方式提出它,并看看e.GetType())。
  4. 是否有其他情况会提高它,我不知道。MSDN不能用于此类请求。

p.s. 1。:我想再重复一遍-不要假设e参数将是某种特定类型。Windows窗体API甚至不能保证e将包含一些具体有用的EventArgs派生类