14

バブリングとトンネリングがどのように機能するかを理解しています。しかし、私はそれらを使用することについて混乱しています。理由は次のとおりです。

マウスクリックイベントを処理したい。泡立てることもあればMouseDown、トンネルを掘ることもあるPreviewMouseDown。ただし、MouseDown必ずしもユーザーがコントロールをクリックしたとは限りません。ユーザーがボタンを押してから離して、クリックをキャンセルした可能性があります。ボタンがクリックされていない場合は、何も変更したくありません。

私の質問は、バブリング/トンネリング戦略はどのように役立つのでしょうか?

4

3 に答える 3

3

こんにちは、ネット上でこれに関するいくつかの良い記事を入手できますが、それでも私はこれに答えようとします.

ボタンに 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 は、イベントを発生させた要素に関連付けられたハンドラーを呼び出すだけでなく、ユーザー インターフェイス要素のツリーをたどり、元の要素からユーザー インターフェイス ツリーのルートまで、任意のノードに関連付けられたルーティング イベントのすべてのハンドラーを呼び出します。

于 2013-09-04T04:36:45.247 に答える
1

あなたが言ったように、バブリング/トンネリングの概念を知っているので、それには入りません。しかし、これはこれらのイベントが意図しているものです。つまり、コントロールまたはその子でマウスボタンがダウンまたはアップされたかどうかClickを知らせます。イベントは正常に機能しています。シナリオでは、マウスがボタン自体に上下がありました。

ありがとう

于 2013-09-04T03:18:16.407 に答える