C# 如何仅在用户ctrl键单击按钮的下半部分时触发事件?

C# 如何仅在用户ctrl键单击按钮的下半部分时触发事件?,c#,wpf,events,event-handling,C#,Wpf,Events,Event Handling,我想在我的应用程序中实现一些秘密功能,它们只能通过按住ctrl键并左键单击按钮的下半部分来调用。这可以在WPF中实现吗?我试图创建一个演示应用程序,但调试没有在click事件处理程序中显示光标位置信息。下面是我的测试代码。有什么想法吗 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xm

我想在我的应用程序中实现一些秘密功能,它们只能通过按住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>

使用System.Windows;
命名空间WpfApplication1
{
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效按钮\u单击(对象发送者,路由目标e)

{/您可以使用
鼠标.GetPosition
获取光标相对于按钮角的位置,并将该位置与按钮的
实际高度进行比较:

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

您可以使用
鼠标.GetPosition
获取光标相对于按钮角的位置,并将该位置与按钮的
实际高度进行比较:

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

您可以使用MouseUp或MouseDown事件,这两个事件都提供了事件参数中的鼠标位置以及按下的鼠标按钮

当鼠标按钮在按钮内被提起时,会触发鼠标向上;当鼠标按钮在按钮内被按下时,会触发鼠标向下(你能猜到吗?)

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

Point p = e.GetPosition(yourButton);

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

您可以使用MouseUp或MouseDown事件,这两个事件都提供了事件参数中的鼠标位置以及按下的鼠标按钮

当鼠标按钮在按钮内被提起时,会触发鼠标向上;当鼠标按钮在按钮内被按下时,会触发鼠标向下(你能猜到吗?)

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

Point p = e.GetPosition(yourButton);

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

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


然后,您可以对其单击处理程序进行编程,使其完全符合您的要求,甚至可以根据需要激活底层可见按钮的单击处理程序。

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


然后,您可以对其单击处理程序进行编程,使其完全符合您的要求,甚至可以根据需要激活底层可见按钮的单击处理程序。

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

除了我认为正确的答案外,您还可以对布局进行调整。例如,您可以定义一个边框,其中包含两个按钮,用户会认为只有一个按钮:

<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>

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

除了我认为正确的答案外,您还可以对布局进行调整。例如,您可以定义一个边框,其中包含两个按钮,用户会认为只有一个按钮:

<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>

为什么不呢?当点击GUI上的某个区域时,OP需要一个特殊的功能。这听起来像是一个按钮的工作。我可能会工作,但如果你不添加新的(隐藏的)按钮就可以完成的话UI元素,对我来说它是干净的为什么不?当点击GUI上的某个区域时,OP想要一个特殊的功能。这听起来像是一个按钮的工作。我可能会工作,但如果你不添加新的(隐藏的)UI元素就可以做到,对我来说它更干净