如何获得右键单击鼠标事件?将EventArgs更改为MouseEventArgs会导致Form1Designer中出错?

Dan*_*nny 25 c# event-handling visual-studio-2012

我有一种方法来检测visual studio通过双击表单所做的左键单击事件.

 private void pictureBox1_Click(object sender, EventArgs e)
 {
 MessageBox.Show("Left click");
 }
Run Code Online (Sandbox Code Playgroud)

我希望通过右键单击同一个对象来进行右键单击事件.

我在网上看到你可以使用这个开关:

 private void pictureBox1_Click(object sender, EventArgs e)
 {
 if (e.Button == System.Windows.Forms.MouseButtons.Right){MessageBox.Show("Right click");}
 if (e.Button == System.Windows.Forms.MouseButtons.Left){MessageBox.Show("Left click");}
 }
Run Code Online (Sandbox Code Playgroud)

麻烦的是,当我这样做时,e.Button有一条红线和错误:

 "'System.EventArgs' does not contain a definition for 'Button'... "
Run Code Online (Sandbox Code Playgroud)

所以我通过将"EventArgs e"更改为"MouseEventArgs e"来解决此问题.

但是Form1Designer中出现了一个新错误,其中事件行是:

 this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
Run Code Online (Sandbox Code Playgroud)

错误说:

"No overload for 'pictureBox1_Click' matches delegate 'System.EventHandler' "
Run Code Online (Sandbox Code Playgroud)

我该如何解决?谢谢阅读

Sri*_*vel 37

您应该在click事件处理程序中引入一个强制转换

MouseEventArgs me = (MouseEventArgs) e;
Run Code Online (Sandbox Code Playgroud)

  • 对于其他读者:此未记录的功能不适用于所有控件.这适用于PictureBox,但不适用于ListView. (3认同)
  • 这是一个可怕的想法。当内部发生变化时,您会乞求被打破。相反,您应该使用下面的解决方案并使用鼠标单击而不是单击。 (2认同)

Cod*_*der 22

您需要MouseClick代替Click事件处理程序,引用.

switch (e.Button) {

    case MouseButtons.Left:
    // Left click
    break;

    case MouseButtons.Right:
    // Right click
    break;
    ...
}
Run Code Online (Sandbox Code Playgroud)


Thu*_*rGr 16

对我来说,MouseClick或Click事件都不起作用,因为当您右键单击时,不会调用事件.快速的方法是:

 private void button1_MouseUp(object sender, MouseEventArgs e)
 {
        if (e.Button == MouseButtons.Right)
        {
            //do something here
        }
        else//left or middle click
        {
            //do something here
        }
 }
Run Code Online (Sandbox Code Playgroud)

您可以修改它以完全根据参数的值进行操作.

警告:只有一个捕获只使用鼠标按下事件.如果你在控件上mousedown然后你将光标移出控件以释放它,你仍然会触发事件.为了避免这种情况,您还应确保在事件处理程序的控件中出现鼠标.在检查按钮之前检查鼠标光标坐标是否在控件的矩形内,将正确执行.

  • 可能不是使用 **MouseUp** 事件,而是使用 **MouseDown** 事件,这样您就不必担心警告中所说的内容。 (3认同)
  • @Pabinator MouseDown 正在产生不自然的行为。您希望操作在您松开按钮时发生,而不是在您按下按钮时发生。发出警告是因为该事件没有按预期工作。当您*释放*按钮时,它应该只在光标位于控件上时触发。它一定是 .NET 故障或什么的。 (2认同)

小智 5

使用鼠标按下事件

if(e.Button == MouseButton.Right)
Run Code Online (Sandbox Code Playgroud)