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,因为它被称为button click event.

4

5 回答 5

8

只需尝试使用button1_MouseDown事件而不是事件。buttons_Click它将解决您的问题。

   private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
          //do something
        }
        if (e.Button == MouseButtons.Right)
        {
          //do something
        }
    }
于 2013-10-04T05:53:51.980 回答
3

它似乎不适用于点击事件。但是 MouseDown 事件会给你一个具有按钮属性的 MouseEventArgs。因此,也许您可​​以修改代码以使用 MouseDown 而不是单击?

var btn = new Button();
btn.Text = "BUTTON";
btn.MouseDown += ((o, e) => {
    MessageBox.Show(e.Button.ToString());
});
于 2013-10-04T05:43:51.987 回答
2

为左右按钮创建一个类布尔变量,默认为false。当鼠标按下事件触发时,将变量设置为 true 并检查两者是否为 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;
 }

资源

于 2013-10-04T05:36:50.543 回答
0

以下代码对我来说效果很好。(请注意,我使用的 EventArgs 类型类似于问题中的函数)。

私人无效按钮_点击(对象发送者,EventArgs e){

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!!");
    }

}

}

于 2017-03-17T18:28:10.780 回答
0

目标: 处理鼠标左键单击和鼠标右键单击。

问题: 单击鼠标右键时未引发 Click 事件。仅当按下鼠标左键然后松开时才会升高。

解决方案:

  1. 订阅 Click 和 MouseRightButtonUp 事件。

注意 A. MouseRightButtonUp 事件在鼠标右键在按钮上释放时引发,无论最初按下时它是否在按钮上。

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

  1. 然后,您可以:

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

    湾。编写一个可以同时处理 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;
    }
}
于 2017-11-18T05:47:57.197 回答