WPF では、ほとんどのコントロールにイベント (およびマウス ボタン固有のバリエーション) がありますMouseUp
がMouseDown
、Click
すぐに使用できる単純なイベントはありません。これらのイベントを使用してクリックのような動作を実現したい場合は、両方を処理する必要がありますが、これは少し面倒だと思います。
明らかな問題は、イベントを単純に省略することはできないということです。MouseDown
なぜなら、クリックが別のコントロールで開始され、MouseUp
クリックのみを処理するコントロール上でリリースされた場合、実際には発生しないはずのクリックが発生してしまうからです。どちらもMouseUp
同じMouseDown
コントロール上で発生するはずです。
したがって、この一般的な問題に対するよりエレガントな解決策があれば、興味があります。
ノート:以下に見られるように、これにはいくつかの良い解決策があります。Rachel の回答は好評のようだったのでそれを受け入れることにしましたが、さらに次の注釈を追加したいと思います。
レイチェルのボタンの答え非常に簡潔でわかりやすいですが、実際のコントロールをボタンでラップする必要があり、場合によっては、コントロールがクリック可能であるという理由だけで、コントロールをボタンと見なさないこともあります (たとえば、ハイパーリンクのような場合)。さらに、毎回テンプレートを参照する必要があります。
リック・スラドキーの行動回答クリックをシミュレートする方法/コントロールをクリック可能にする方法という元の質問に、より直接的に答えていますが、欠点は参照が必要でありSystem.Windows.Interactivity
、Rachel のソリューションと同様に、Xaml コードがかなり膨らむことです。
添付イベントの回答Xaml マークアップの点では、1 つの属性で実行できる通常のクリック イベントに非常に近いという利点がありますが、コード内のイベント添付がきれいにカプセル化されていないという唯一の問題があります (修正方法をご存知の方がいらっしゃいましたら、回答にコメントを追加してください)。
ベストアンサー1
コントロールを使用しButton
て上書きしButton.Template
、コンテンツを直接表示します。
<ControlTemplate x:Key="ContentOnlyTemplate" TargetType="{x:Type Button}">
<ContentPresenter />
</ControlTemplate>
<Button Template="{StaticResource ContentOnlyTemplate}">
<Label Content="Test"/>
</Button>