2016-08-11 17 views
0

私のアプリケーションにいくつかの秘密の機能を実装したいのですが、Ctrlキーを押してボタンの下半分を左クリックするだけで呼び出すことができます。これはWPFで実装することは可能ですか?デモアプリケーションを作成しようとしましたが、デバッグではクリックイベントハンドラのカーソル位置情報が表示されません。以下は私のテストコードです。何か案は?ユーザーがCtrlキーを押しながらボタンの下半分をクリックしたときにのみイベントをトリガーする方法はありますか?

<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

あなたは、ボタンの隅にカーソル位置を取得し、ボタンのActualHeightに位置を比較することMouse.GetPositionを使用することができます。

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

あなたが使用することができますMouseUpまたはMouseDownイベントは、どちらのマウスボタンが押されたかだけでなく、イベント引数のマウス位置を提供します。

ボタンの中でマウスボタンを押したときにマウスが上がったとき、マウスボタンが押されているときにマウスが下がっているときにマウスが上がったときにトリガされます(推測できますか?)。

編集:私はちょうどMouseDownイベントの詳細を確認し、あなたがボタンにマウスの位置を取得するために

Point p = e.GetPosition(yourButton); 

を使用する必要があります(あなたがマウスを得るために任意のコントロールによってyourButtonを置き換えることができます

0

既存のボタンの下半分の上に2番目のボタンを追加しますが、ユーザーには表示されないように設定します。

クリックハンドラをプログラムして、必要なものを正確に実行することができます。必要に応じて、表示されているボタンのクリックハンドラを有効にすることもできます。

+0

私は、これはこれを行うにはきれいな方法であるかわからない.... –

+0

なぜいけないのでしょうか? GUI上の特定の領域がクリックされると、OPは特別な機能を必要とします。それはボタンの仕事のように聞こえる。 – user2647513

+0

私はおそらく動作しますが、新しい(隠された)UI要素を追加せずにそれを行うことができれば、私にとってはよりクリーンです –

0

これを行う方法はたくさんあります。

答えに加えて、私は正しいと思いますが、あなたはレイアウトで遊んでもいいです。たとえば、ユーザーが一つだけのボタンがあることを考えるでしょう二つのボタン含む、境界線を定義することができます:あなたが定義されたスタイルのボタンから国境を除去することにより

<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"); 
} 
関連する問題