无法处理PreviewMouseDown(Not able to handle PreviewMou

2019-09-28 00:23发布

嘿; 我有一个用户控件以下视觉hyerarchy:

网格 - >帆布 - > MyContentControl

MyContentControl是自ContentControl派生的类,它的顶部有一个装饰器是一个矩形,这是为了更容易地点击特定对象(增加命中测试区域)。 装饰器是本在所有时间,但具有透明背景。

我想看看当我点击从用户控件的代码隐藏一个MyContentControl提出的PreviewMouseDown事件,但似乎该事件并没有在那里长大,只有在装饰器级别。

本次活动是在装饰器级处理,但e.IsHandled没有设置为true,所以应该继续鼓泡或隧道。 从我读,PreviewMouseDown是隧道,并IIRC,它应该已经在用户控件首次提出。

我缺少的东西吗?

谢谢。

Answer 1:

既然你描述的实际视觉树看起来像这样的结构:

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

正如你看到的,你的装饰器( MyContentControlAdorner )位于树比你的自定义控件的不同分支。 这是因为装饰器被放置称为一个特殊的元素中AdornerLayer 。 这样AdornerLayer通常直接位于顶层元素内(如WindowPage )。

因此,考虑到所有这些,应该清楚的是,如果事件在装饰器抬起它会通过以下路径隧道: Window -> AronerLayer -> MyContentControlAdorner

话虽这么说,你不能在位于不同的子树两个元素(即使它们被放置在另一个上面一个)处理鼠标事件。



文章来源: Not able to handle PreviewMouseDown