嘿;我在usercontrol中有以下视觉层次结构:
网格 - >画布 - > MyContentControl
MyContentControl是一个派生自ContentControl的类,它在顶部有一个矩形的装饰器,这样可以更容易地点击某些对象(增加命中测试区域)。装饰品始终存在,但背景透明。
我希望看到当我从usercontrol的代码隐藏中点击MyContentControl时引发的PreviewMouseDown事件,但事件似乎没有在那里引发,仅在引用程序级别。
事件在装配器级别处理,但e.IsHandled未设置为true,因此应继续冒泡或隧道。从我读到的,PreviewMouseDown是隧道,而IIRC,它应该首先在用户控件中引发。
我错过了什么吗?
谢谢。
答案 0 :(得分:3)
鉴于您描述的结构,实际的可视树将如下所示:
Window
-> Grid
-> Canvas
-> MyContentControl
-> AdornerLayer
-> MyContentControlAdorner
如您所见,您的装饰工具(MyContentControlAdorner
)位于树的不同分支中,而不是您的自定义控件。这是因为装饰者被放置在名为AdornerLayer
的特殊元素中。此类AdornerLayer
通常直接位于顶级元素内(例如Window
或Page
)。
因此,考虑到所有这些,应该很清楚,如果在装饰器中引发事件,它将通过以下路径进行隧道传输:Window -> AronerLayer -> MyContentControlAdorner
。
话虽这么说,你不能处理位于不同子树中的两个元素上的鼠标事件(即使它们是一个放在另一个上面)。