我的问题是因为我认为很简单,但它变得有点复杂,我想要实现的是:我在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
。
答案 0 :(得分: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
}
}
答案 1 :(得分:3)
它似乎不适用于click事件。但MouseDown事件将为您提供具有按钮属性的MouseEventArgs。那么也许您可以修改代码以使用MouseDown而不是单击?
var btn = new Button();
btn.Text = "BUTTON";
btn.MouseDown += ((o, e) => {
MessageBox.Show(e.Button.ToString());
});
答案 2 :(得分:2)
为左右按钮创建一个类boolean变量,默认为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;
}
答案 3 :(得分:0)
以下代码对我很有用。 (请注意,我使用的EventArgs类型与问题中的函数类似)。
private void buttons_Click(object sender,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!!");
}
}
}
答案 4 :(得分:0)
<强>目的:强> 要处理鼠标左键单击和鼠标右键单击。
<强>问题:强> 单击鼠标右键时,不会引发Click事件。仅在按下鼠标左键然后释放时才会引发它。
<强>解决方案:强>
注意A。鼠标右键在按钮上释放时会引发MouseRightButtonUp事件,无论最初按下按钮是否超过按钮。
注意B。这与这种情况无关,但你应该注意到Button对象的Click事件(按下并释放Mouse Left-button)同时处理MouseLeftButtonDown和MouseLeftButtonUp事件,因此当您使用鼠标左键单击Button对象时,这些事件都不能处理。如果您确实需要单独处理这些操作,则应订阅PreviewMouseLeftButtonDown和/或PreviewMouseLeftButtonUp。
然后您可以:
一个。有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;
}
}