嘿; 我有一个用户控件以下视觉hyerarchy:
网格 - >帆布 - > MyContentControl
MyContentControl是自ContentControl派生的类,它的顶部有一个装饰器是一个矩形,这是为了更容易地点击特定对象(增加命中测试区域)。 装饰器是本在所有时间,但具有透明背景。
我想看看当我点击从用户控件的代码隐藏一个MyContentControl提出的PreviewMouseDown事件,但似乎该事件并没有在那里长大,只有在装饰器级别。
本次活动是在装饰器级处理,但e.IsHandled没有设置为true,所以应该继续鼓泡或隧道。 从我读,PreviewMouseDown是隧道,并IIRC,它应该已经在用户控件首次提出。
我缺少的东西吗?
谢谢。
既然你描述的实际视觉树看起来像这样的结构:
Window
-> Grid
-> Canvas
-> MyContentControl
-> AdornerLayer
-> MyContentControlAdorner
正如你看到的,你的装饰器( MyContentControlAdorner
)位于树比你的自定义控件的不同分支。 这是因为装饰器被放置称为一个特殊的元素中AdornerLayer
。 这样AdornerLayer
通常直接位于顶层元素内(如Window
或Page
)。
因此,考虑到所有这些,应该清楚的是,如果事件在装饰器抬起它会通过以下路径隧道: Window -> AronerLayer -> MyContentControlAdorner
。
话虽这么说,你不能在位于不同的子树两个元素(即使它们被放置在另一个上面一个)处理鼠标事件。