1

おい; ユーザーコントロールに次の視覚的な階層があります。

グリッド->キャンバス->MyContentControl

MyContentControlは、ContentControlから派生したクラスで、上部に長方形の装飾があります。これにより、特定のオブジェクトをクリックしやすくなります(ヒットテスト領域が増えます)。装飾者は常に存在しますが、背景は透明です。

ユーザーコントロールのコードビハインドからMyContentControlをクリックしたときにPreviewMouseDownイベントが発生するのを見たいのですが、イベントはそこで発生していないようで、装飾者レベルでのみ発生しているようです。

イベントは装飾者レベルで処理されますが、e.IsHandledがtrueに設定されていないため、バブリングまたはトンネリングを続行する必要があります。私が読んだところによると、PreviewMouseDownはトンネリングであり、IIRCは、最初にユーザーコントロールで発生するはずです。

私は何かが足りないのですか?

ありがとうございました。

4

1 に答える 1

3

説明した構造を考えると、実際のビジュアルツリーは次のようになります。

Window
 -> Grid
    -> Canvas
       -> MyContentControl
 -> AdornerLayer
    -> MyContentControlAdorner

ご覧のとおり、装飾者(MyContentControlAdorner)は、カスタムコントロールとは異なるツリーのブランチに配置されています。これは、装飾者が。と呼ばれる特別な要素の中に配置されているためですAdornerLayer。これAdornerLayerは通常、最上位の要素(WindowまたはなどPage)のすぐ内側にあります。

したがって、これらすべてを考慮すると、装飾者でイベントが発生した場合、次のパスでトンネリングすることは明らかですWindow -> AronerLayer -> MyContentControlAdorner

そうは言っても、異なるサブツリーにある2つの要素でマウスイベントを処理することはできません(それらが上下に配置されている場合でも)。

于 2011-04-20T18:54:06.497 に答える