2017-05-30 3 views
0

WPFで私はカスタムコントロールテンプレートでボタンを使用しています。WPFルーティングされたイベントでクリックされた要素を区別する

マイボタンには、画像のようないくつかのサブ要素が含まれています。

<ControlTemplate x:Key="myKey" TargetType="Button"> 
... 
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Right"> 
     <Image x:Name="img1" /> 
     ... 
     <Image x:Name="img2" /> 

私は、上記のテンプレートを使用するボタンに1つのクリックハンドラーを適用しました。

ここで、ボタンのビジュアルツリーのどの要素が正確にクリックされたかを知りたいと思います。たとえば、img1、img2、...

クリックイベントのルーティングイベント引数を使用して元の要素を区別できますか?

は、クリック源だった場合は、(画像を得ることができます

<Button Template="{StaticResource myKey}" 
     PreviewMouseDown="Button_PreviewMouseDown" 
     Click="Button_Click"/> 

のように(代わりにClickイベントの)PreviewMouseDownイベントを使用することによってこれが可能である

ルネ

答えて

1

ありがとう画像)に、イベント引数のOriginalSourceを使用します。これを古典的なClickイベントと組み合わせると、クリックのイメージが得られます。

private Image buttonDownImage; 

private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    buttonDownImage = e.OriginalSource as Image; 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (buttonDownImage != null) 
    { 
     //The click source the buttonDownImage 
    } 
} 

理由はルーティング戦略です。これはイベントがどのように行われているかを意味します。このルーティング戦略の詳細については、MSDNまたはWPF tutorialを参照してください。

+0

これは私が欲しかったものではありません。 PreviewMouseDownイベントにはオリジナルソースとしてイメージが含まれています。これはこれまでのところ動作します。しかし、PreviewMouseUpイベントにはイメージが含まれていません。したがって、ユーザは、ボタン上のサブ画像をクリックし、マウスを離して、ボタンを離すことができ、これを画像上の「クリック」として認識することができる。 (バブリング)クリックイベントを直接使用する方法はありますか? – Rene

+0

私は同じ考えを持っていました。しかし、これは問題を引き起こします。ユーザーがクリックしてボタンの外にマウスを移動し、ボタンの外にリリースすると、プレビューイベントは発生しますが、クリックイベントは発生しません。したがって、次のクリックがイメージ上にあるかどうかに関係なく、次回ユーザーがボタンをクリックすると、 "buttonDownImage"はnullになりません。ユーザーがクリックしたボタンの外にマウスボタンを離した場合、グローバルフラグをリセットする堅牢な方法が見つかりませんでした。 – Rene

+0

私は正しいとは思わない:例を見てみましょう:クリックはabortet、buttonDownImageはnullではありません。ユーザが(画像ではなく)再度クリックすると、 'buttonDownImage = e.OriginalSource as Image;'がnullに設定されます(ソースに画像がないため)。これはアプローチが機能することを意味します。 – Fruchtzwerg

関連する問題