4

コントロール A と B の 2 つのコントロールがあります。コントロール B は A の上に配置されます。B をクリックすると、クリックされたイベントのみが発生しますが、A のクリック イベントも発生する必要があります。これは、ルーティング イベントを使用して何とか実現できますか?

コントロールのスクリーンショットは次のとおりです。

代替テキスト http://www.imagebanana.com/img/hu5znv4/buttons.png

もちろん、このケースは単なる例にすぎません。マウス カーソルの下のすべてのコントロールのイベントを 1 つの場所で発生させる一般的な方法を探しています。ただし、この問題の具体的な解決策は私にも役立ちます! ヒントをありがとうございました!

4

1 に答える 1

2

これは、内部コントロールのイベント ハンドラーが e.Handled プロパティを true に設定した場合に発生する可能性があります。これにより、ルーティング イベントがそれ以上バブリングするのを防ぐことができます。しかし、確認したところ、WPF 4 ではその動作が見られません。

e.Handled がイベントを妨げている場合、できることは、ブール値の handlerEventsToo パラメータを受け取るUIElement.AddHandlerオーバーロードを使用して、クリック イベントをフックすることです。これは、マークアップではなく、コードで行う必要があります。次に、外側のコントロールで Click イベントを受け取る必要があり、e.Handled プロパティは既に true に設定されています。

次のコードは、内側のボタンをクリックしたときに両方のボタンの背景を設定します。

<Grid>
    <Button VerticalAlignment="Center" HorizontalAlignment="Center" Click="Click1">
        <Button Width="100" Height="25" Margin="20" Click="Click2" />
    </Button>
</Grid>

コードビハインド

private void Click1( object sender, RoutedEventArgs e )
{
    ( (Button)sender ).Background = new SolidColorBrush( Colors.Blue );
}

private void Click2( object sender, RoutedEventArgs e )
{
    ( (Button)sender ).Background = new SolidColorBrush( Colors.Red );
    //e.Handled = true; // uncomment to stop bubbling
}
于 2010-07-01T13:55:25.473 に答える