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
イベントを使用することによってこれが可能である
ルネ
これは私が欲しかったものではありません。 PreviewMouseDownイベントにはオリジナルソースとしてイメージが含まれています。これはこれまでのところ動作します。しかし、PreviewMouseUpイベントにはイメージが含まれていません。したがって、ユーザは、ボタン上のサブ画像をクリックし、マウスを離して、ボタンを離すことができ、これを画像上の「クリック」として認識することができる。 (バブリング)クリックイベントを直接使用する方法はありますか? – Rene
私は同じ考えを持っていました。しかし、これは問題を引き起こします。ユーザーがクリックしてボタンの外にマウスを移動し、ボタンの外にリリースすると、プレビューイベントは発生しますが、クリックイベントは発生しません。したがって、次のクリックがイメージ上にあるかどうかに関係なく、次回ユーザーがボタンをクリックすると、 "buttonDownImage"はnullになりません。ユーザーがクリックしたボタンの外にマウスボタンを離した場合、グローバルフラグをリセットする堅牢な方法が見つかりませんでした。 – Rene
私は正しいとは思わない:例を見てみましょう:クリックはabortet、buttonDownImageはnullではありません。ユーザが(画像ではなく)再度クリックすると、 'buttonDownImage = e.OriginalSource as Image;'がnullに設定されます(ソースに画像がないため)。これはアプローチが機能することを意味します。 – Fruchtzwerg