こんにちは、ネット上でこれに関するいくつかの良い記事を入手できますが、それでも私はこれに答えようとします.
ボタンに 1 つの Rectangle で構成される非常に単純な外観を与え、コンテンツとして単純なテキストを提供するとします。このような基本的なビジュアルでも、テキストと四角形の 2 つの要素が存在します。マウスがテキストまたは長方形の上にあるかどうかにかかわらず、マウスクリック。標準の .NET イベント処理モデルでは、これは両方の要素に対して MouseLeftButtonUp イベント ハンドラーを登録することを意味します。
この問題は、WPF のコンテンツ モデルを利用するとさらに悪化します。Button は、キャプションとしてプレーン テキストを使用することに制限されません。コンテンツとして任意のオブジェクトを含めることができます。以下の xaml は特に野心的なものではありませんが、これでも 6 つの要素が表示されています。黄色のアウトラインの円、目の 2 つの点、口の曲線、テキスト、およびボタンの背景そのものです。要素ごとにイベント ハンドラーをアタッチするのは面倒で非効率的です。MouseDown を機能させるには、このコードに 8 つの MouseDownEvents を追加する必要があります。
<Button PreviewMouseDown="PreviewMouseDownButton" MouseDown="MouseDownButton">
<Grid PreviewMouseDown="PreviewMouseDownGrid" MouseDown="MouseDownGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Canvas PreviewMouseDown="PreviewMouseDownCanvas" MouseDown="MouseDownCanvas" Width="20" Height="18" VerticalAlignment="Center">
<Ellipse PreviewMouseDown="PreviewMouseDownEllipse" MouseDown="MouseDownEllipse" x:Name="myEllipse" Canvas.Left="1" Canvas.Top="1" Width="16" Height="16" Fill="Yellow" Stroke="Black" />
<Ellipse Canvas.Left="4.5" Canvas.Top="5" Width="2.5" MouseDown="MouseDownEllipse" Height="3" Fill="Black" />
<Ellipse Canvas.Left="11" Canvas.Top="5" Width="2.5" MouseDown="MouseDownEllipse" Height="3" Fill="Black" />
<Path Data="M 5,10 A 3,3 0 0 0 13,10" Stroke="Black" MouseDown="Path_MouseDown_1"/>
</Canvas>
<TextBlock Grid.Column="1" MouseDown="TextBlock_MouseDown_1">Click!</TextBlock>
</Grid>
</Button>
WPF は RoutedEvents Bubble/Tunnel /Normalを使用します。これは、通常のイベントよりも徹底しています。WPF は、イベントを発生させた要素に関連付けられたハンドラーを呼び出すだけでなく、ユーザー インターフェイス要素のツリーをたどり、元の要素からユーザー インターフェイス ツリーのルートまで、任意のノードに関連付けられたルーティング イベントのすべてのハンドラーを呼び出します。