如何在WPF C#中检查鼠标按钮是左键还是右键?

3

我正在尝试这段代码,实际上我只创建了一个事件处理程序,即 Click="button_Click"

XAML:

<Window x:Class="WPFAPP.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WPFAPP"
    mc:Ignorable="d"
    Title="Window1" Height="447.625" Width="562">

    <Grid>
        <Button x:Name="btn1" Content="Button1" Click="button_Click" HorizontalAlignment="Left" Margin="26,22,0,0" VerticalAlignment="Top" Width="75"/>
        <Button x:Name="btn2" Content="Button2" Click="button_Click" HorizontalAlignment="Left" Margin="26,61,0,0" VerticalAlignment="Top" Width="75"/>
        <Button x:Name="btn3" Content="Button3" Click="button_Click" HorizontalAlignment="Left" Margin="26,100,0,0" VerticalAlignment="Top" Width="75"/>
        <Button x:Name="btn4" Content="Button4" Click="button_Click" HorizontalAlignment="Left" Margin="26,137,0,0" VerticalAlignment="Top" Width="75"/>
        <Button x:Name="btn5" Content="Button5" Click="button_Click" HorizontalAlignment="Left" Margin="26,174,0,0" VerticalAlignment="Top" Width="75"/>
    </Grid>
</Window> 

C#的Code Behind:

private void button_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    if(e.Equals(Mouse.RightButton))
    {
        button.ClearValue(Button.BackgroundProperty);
        button.Background = Brushes.Green;
    } 
} 

我曾经认为按钮单击必须始终是您的主要按钮(根据您的PC设置而定),无论它是左键还是右键。 - BugFinder
我不是男性...那么在e中你得到了什么值(这原本是我的问题),因为我非常确定e不仅仅是鼠标按钮。 - BugFinder
1
你在这里想要做什么?我闻到了一个 XY 问题。 - Abion47
@ManfredRadlwimmer已经回答了你的问题,他说是RoutedEventArgs(我知道),但你忽略了他的回答。你正在错误的方向上进行。 - BugFinder
@Shahbaz 回复他人时请使用“@”字符,而不是“#”字符。否则,我们将无法收到通知,您的回复很容易被忽略。 - Abion47
显示剩余16条评论
3个回答

10

Click仅设计用于最基本的交互操作。如果您使用更高级的鼠标事件,例如MouseDown、MouseUp或DoubleClick,则会获得MouseButtonEventArgs,其中包含有关事件的所有详细信息。

原因是Click不是鼠标事件,您甚至可以通过触摸、笔触或按下Return键来触发它。

因此,请尝试使用MouseDown、MouseUp或DoubleClick等其他事件。

例如:

<Button MouseDoubleClick="Button_MouseDoubleClick" >Click me</Button>
private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    if(e.ChangedButton == MouseButton.Right)
    {
    }
    e.Handled = true;
}

或用于鼠标按下事件

<Button MouseDown="Button_MouseDown" >Click me</Button>
private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
    if(e.ChangedButton == MouseButton.Right)
    {
    }
    e.Handled = true;
}

那个错误是由于尝试在事件的所有者之外触发事件引起的。 - MikeT
@Shahbaz,我已经在示例中说明了如何调用该事件。 - MikeT
左键和右键有两个不同的事件:MouseLeftbuttondown 和 MouseRightbuttondown。 - Rudra
1
@Rudra,虽然有一些其他的方法,但我个人从未费心去尝试。简单的“ChangedButton”检查很容易编写,并且比更改事件绑定更容易更改,如果您在将来改变了某些交互方式的想法,这将非常方便。更不用说,如果我关心它是左还是右,那通常是因为我希望在两者上都发生某些事情。 - MikeT
@MikeT 感谢你,现在我的问题已经解决了,你的代码是正确且运行良好的! - Shahbaz
我们可以拥有小的函数单位,可以从多个事件中调用,从而提高可维护性。否则,我们可以在网格级别实现所有按钮的鼠标按下事件,而不需要在按钮级别定义事件。 - Rudra

1

最好为左右鼠标按键分别设置事件处理程序。如果需要根据点击的按钮进行操作,请参考以下方法。

<Button MouseLeftButtonDown="Button_MouseLeftButtonDown" MouseRightButtonDown="Button_MouseRightButtonDown"></Button>

以下是后台代码。
private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

}

private void Button_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{

}

如果你想获取触发事件的按钮,可以检查e.OriginalSource属性。

我不同意“总是更好”的说法,因为一次性完成事情总比多次更好。有可能你想要不同的操作来处理左、右、中、特殊1、特殊2或任何多个按钮组合,一个简单的MouseDown就可以处理所有这些,而左右键则不能。 - MikeT
那么,您是否打算为所有按钮支持网格级MouseDown事件处理? - Rudra
如果需要的话就要看情况,通常你只想激活按钮,所以激活的方法并不重要,这种情况下我会绑定一个命令,但是如果我确实需要有多种激活相同控件的方式,那么我总是会针对一个单一的入口点。 - MikeT
如果是这样的话,单一入口点将是更好的选择,否则最好有单独的事件来降低错误率。 - Rudra
1
@Shahbaz 它可以与任何鼠标按钮事件一起使用,请参见 https://msdn.microsoft.com/zh-cn/library/system.windows.input.mousebuttoneventhandler(v=vs.110).aspx 我建议使用 MouseUp 或 MouseDown,Rudra MouseRightUp 或 MouseRightDown。 - MikeT
显示剩余3条评论

0

通过使用MVVM,您可以为ListView项上的左键双击执行操作,例如:

要添加的命名空间是“Window”或“UserControl”

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

列表视图:

<ListView x:Name="lvComputers"
          IsSynchronizedWithCurrentItem="True"
          ...>
  <!-- Double Click -->
  <i:Interaction.Triggers>
     <i:EventTrigger EventName="MouseDoubleClick">
        <i:InvokeCommandAction Command="{Binding ListViewComputers_MouseDoubleClick}"
                               CommandParameter="{Binding ElementName=lvComputers, Path=SelectedItem}"
                               />
     </i:EventTrigger>
  </i:Interaction.Triggers>
</ListView>

然后绑定的事件:

private void ListViewComputers_MouseDoubleClick(object obj)
{
   //Allow only left button double click
   if (Mouse.LeftButton == MouseButtonState.Pressed)
   {
      //Code to execute on Left Button Double Click
   }
}

"

“Mouse” 需要:

"
using System.Windows.Input;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接