2011-04-20 15 views
1

Hey;私は、ユーザーコントロールで、次の視覚的なhyerarchyがありますPreviewMouseDownを処理できません

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

MyContentControlが、これはやすくするために長方形である上にadornerを持ってContentControlにから派生したクラスです特定のオブジェクトをクリックします(ヒットテストエリアを増やします)。アドヴナーは常に存在しますが、透明な背景があります。

私は、UserControlのコードビハインドからMyContentControlをクリックしたときに発生したPreviewMouseDownイベントを見たいと思いますが、イベントはadornerレベルでしか発生していないようです。

イベントはadornerレベルで処理されますが、e.IsHandledはtrueに設定されていないため、バブリングまたはトンネリングを続行する必要があります。私が読んだところから、PreviewMouseDownはトンネリングし、IIRCは、まずusercontrolで呼び出されているはずです。

何か不足していますか?

ありがとうございます。あなたは、実際のビジュアルツリーを説明した構造を考える

答えて

3

はこのようなものになります。ご覧のとおり

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

を、あなたのadorner(MyContentControlAdorner)は、カスタムコントロールよりもツリーの別のブランチに位置しています。これは、飾り文字がAdornerLayerという特別な要素の内側に配置されているためです。そのようなAdornerLayerは、通常、トップレベル要素の内側に直接配置されます(WindowまたはPageなど)。

これをすべて考慮すると、イベントがadornerで発生した場合、次のパスによってトンネルされます:Window -> AronerLayer -> MyContentControlAdorner

つまり、異なるサブツリーに配置された2つの要素(別の要素が上に配置されているにもかかわらず)にマウスイベントを処理することはできません。

+0

ありがとうございます。 –