我想在我的应用程序中实现一些秘密功能,只能通过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
}
}
}
答案 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>
通过从您定义的样式中删除按钮的边框,您将得到如下内容:
当用户将鼠标悬停在其上时,您还可以使用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)
在现有按钮的下半部分顶部添加第二个按钮,但将其设置为对用户不可见。
然后,您可以对其单击处理程序进行编程,使其完全符合您的要求,如果您愿意,甚至可以激活基础可见按钮的单击处理程序。