2013-10-04 62 views
3

我的问题是因为我认为简单,但它变得更复杂一点,我试图实现的是这样的:我有几个按钮在我的WinForm中做几乎相同的事情,所以我创建了一个事件来处理所有这些事件,现在我希望根据他们点击哪个鼠标按钮给他们一些其他的功能,例如,如果按钮被点击左键执行,但是如果它的右键单击以其他方式执行,这可以实现吗?,任何帮助将不胜感激。检测按钮是左键还是右键

我正在寻找一些语句像这样也许......

private void buttons_Click(object sender, EventArgs e) 
     { 
if(e.buttons==mousebuttons.right) 
//do something 
else 
//do other thing 
} 

正如你所知道的是,这是无法实现的,因为e上有没有mouse button events的东西,造成i'ts是称为button click event

+1

A “点击” 的定义是一个单一的,左击鼠标。您的用户也会期待这一点。如果右键单击程序中的某个按钮,可能会引起混淆。也许你可以找到更符合标准的方法来开始你的行动。毕竟一个按钮上只有一个文本,要传达两种意义的两种含义,只有一个文本才能让用户点击按钮。 – nvoigt

+0

任何时候,我已经做了这样的事情,我已经使用了MouseUp事件,因为click事件同时包含MouseDown和MouseUp事件,并且在鼠标被释放之前不会被触发,所以它在我心中是最合乎逻辑的地方做那样的事情。 –

+0

您可以_type cast_'EventArgs e'到'MouseEventArgs'。但是,它只会捕获'mousebuttons.left',但不会'mousebuttons.right'。 – Edper

回答

2

它似乎并不与click事件工作。但是MouseDown事件会给你一个MouseEventArgs,它有一个button属性。所以也许你可以修改你的代码来使用MouseDown而不是点击?

var btn = new Button(); 
btn.Text = "BUTTON"; 
btn.MouseDown += ((o, e) => { 
    MessageBox.Show(e.Button.ToString()); 
}); 
+2

由于点击事件由MouseDown和MouseUp组成,我会更倾向于使用MouseUp事件。恕我直言 –

1

为左右按钮创建一个类布尔变量默认为false。当鼠标停止事件触发时,将变量设置为true并检查两者是否都为真。当鼠标起火时将变量设置为false。

public bool m_right = false; 
public bool m_left = false; 

private void MainForm_MouseDown(object sender, MouseEventArgs e) 
{ 
    m_objGraphics.Clear(SystemColors.Control); 

    if (e.Button == MouseButtons.Left) 
     m_left = true; 
    if (e.Button == MouseButtons.Right) 
     m_right = true; 

    if (m_left == false || m_right == false) return; 
    //do something here 
} 

private void MainForm_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
     m_left = false; 
    if (e.Button == MouseButtons.Right) 
     m_right = false; 
} 

Source

8

button1_MouseDown事件,而不是buttons_Click Event.It只要尝试将解决您的问题。

private void button1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      //do something 
     } 
     if (e.Button == MouseButtons.Right) 
     { 
      //do something 
     } 
    } 
+0

thx为你的答案朋友,最终它帮助我解决了我的问题,并且实际上是一个非常简单的解决方案,唯一我必须意识到的是,你在窗体中讨论按钮事件而不是鼠标按钮事件XD ...男孩这是某种混乱。无论如何,这个答案真的帮助我,它在那里,但有时需要一个问题以外的人看到它 – user2793090

0

以下代码对我很好用。 (请注意,我正在使用与问题中的函数类似的EventArgs类型)。

私人无效buttons_Click(对象发件人,EventArgs的){

Type t = e.GetType(); 
if (t.Equals(typeof(MouseEventArgs))) 
{ 
    MouseEventArgs mouse = (MouseEventArgs)e; 

    if (mouse.Button == MouseButtons.Left) 
    { 
     Console.WriteLine("****Left!!"); 
    } 

    if (mouse.Button == MouseButtons.Right) 
    { 
     Console.WriteLine("****Right!!"); 
    } 

} 

}

0

目的: 要处理两个鼠标左键和单击鼠标右键。

问题: 单击鼠标右键时不会引发Click事件。只有当鼠标左键被按下然后释放时才会产生。

解决方案:

  1. 订阅无论是点击,和的MouseRightButtonUp事件。

注A.的的MouseRightButtonUp事件当鼠标右键按钮被释放到按钮上提出的,不管它在按钮上时,它最初被按下。

注B.这与这种情况无关,但您应该注意到Button对象的Click事件(按下并释放鼠标左键)同时处理MouseLeftButtonDown和MouseLeftButtonUp事件,因此这两个事件都不能在处理时处理您使用鼠标左键单击Button对象。如果您确实需要分别处理这些操作,则应订阅PreviewMouseLeftButtonDown和/或PreviewMouseLeftButtonUp。

  • 然后可以或者:

    一个。有2个独立的事件处理程序,每个事件处理程序一个,或

    b。编写一个可处理Click和MouseRightButtonUp事件的事件处理程序。 注意:Click事件需要一个接受类型为RoutedEventArgs的参数的处理程序,而MouseRightButtonUp事件需要MouseButtonEventArgs类型之一。 RoutedEventArgs和MouseButtonEventArgs都从EventArgs继承。因此,使处理程序接受EventArgs。然后处理程序应该确定它是否已经传递了一个RoutedEventArgs(在这种情况下,它执行左键单击所需的操作)或MouseButtonEventArgs(在这种情况下,它执行右键单击所需的操作)。

  • 代码例如:

    myButton.MouseRightButtonUp += MenuItemButton_Click; 
    myButton.Click += MenuItemButton_Click; 
    
    internal void MenuItemButton_Click(object sender, EventArgs e) 
    { 
        var clickedButton = sender as Button; 
        string EventArgsType = e.GetType().ToString(); 
        //Remove leading qualification from Type ("System.Windows." or "System.Windows.Input.") 
        EventArgsType = type.Substring(EventArgsType.LastIndexOf('.') + 1); 
        switch (EventArgsType) 
        { 
         //Handle R-Click (RightMouseButtonUp) 
         case "MouseButtonEventArgs": 
          var MbeArgs = e as MouseButtonEventArgs; 
          //Do stuff 
          break; 
         //Handle L-Click (Click) 
         case "RoutedEventArgs": 
          var ReArgs = e as RoutedEventArgs; 
          //Do stuff 
          break; 
         default: 
          break; 
        } 
    }