如何仅在用户按住Ctrl键单击按钮的下半部分时才触发事件?

时间:2016-08-11 17:52:16

标签: c# wpf events event-handling

我想在我的应用程序中实现一些秘密功能,只能通过ctrl左键单击按钮的下半部分来调用它们。这可以在WPF中实现吗?我试图创建一个演示应用程序,并且调试没有向我显示click事件处理程序中的光标位置信息。下面是我的测试代码。有什么想法吗?

<Window x:Class="WpfApplication1.MainWindow"
        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:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="255.284" Width="313.918">
    <Grid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="81,89,0,0" VerticalAlignment="Top" Width="158" Height="49" Click="button_Click"/>
    </Grid>
</Window>
using System.Windows;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        { // <----- set break point here, can't find cursor info in e and sender

        }
    }
}

4 个答案:

答案 0 :(得分:1)

您可以使用MouseUp或MouseDown事件,它们都会在事件参数中提供鼠标位置,以及按下了哪个鼠标按钮。

当鼠标按钮在按钮内部抬起时触发鼠标向上,而在按钮内按下按钮时,鼠标按下(你能猜出吗?)。

编辑:我刚检查了MouseDown的详细信息,你必须使用

Point p = e.GetPosition(yourButton);

获取鼠标相对于按钮的位置(您可以用任何控件替换yourButton以获得相对于它的鼠标位置)

答案 1 :(得分:1)

有很多方法可以做到这一点!

除了提供的答案,我认为是正确的,您还可以使用布局。例如,您可以定义一个边框,其中包含两个按钮,用户会认为只有一个按钮:

<Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="250" Height="100" >
    <Border BorderBrush="Black" BorderThickness="1" MouseEnter="border_MouseEnter" MouseLeave="border_MouseLeave">
        <StackPanel>
            <Button  VerticalAlignment="Top" Height="50" Style="{StaticResource ButtonStyle}" Content="MainButton"></Button>
            <Button  VerticalAlignment="Bottom" Content="SecretArea" Style="{StaticResource ButtonStyle}" Height="50" Click="Button_Click"></Button>
        </StackPanel>
    </Border>
</Grid>

通过从您定义的样式中删除按钮的边框,您将得到如下内容:

enter image description here

当用户将鼠标悬停在其上时,您还可以使用MouseEnter和MouseLeave事件设置边框的背景颜色。

无论如何,当用户点击秘密区域按钮时,您只需处理该事件:

private void Button_Click(object sender, RoutedEventArgs e)
{
      MessageBox.Show("Secret Area");
}

答案 2 :(得分:0)

您可以使用Mouse.GetPosition获取相对于按钮角落的光标位置,并将位置与按钮的ActualHeight进行比较:

var pos = Mouse.GetPosition(button);
if(pos.Y >= button.ActualHeight * 0.5)
{
    //do something
}

答案 3 :(得分:0)

在现有按钮的下半部分顶部添加第二个按钮,但将其设置为对用户不可见。

然后,您可以对其单击处理程序进行编程,使其完全符合您的要求,如果您愿意,甚至可以激活基础可见按钮的单击处理程序。