无法处理PreviewMouseDown

时间:2011-04-20 18:35:32

标签: c# .net wpf event-handling routed-events

嘿;我在usercontrol中有以下视觉层次结构:

网格 - >画布 - > MyContentControl

MyContentControl是一个派生自ContentControl的类,它在顶部有一个矩形的装饰器,这样可以更容易地点击某些对象(增加命中测试区域)。装饰品始终存在,但背景透明。

我希望看到当我从usercontrol的代码隐藏中点击MyContentControl时引发的PreviewMouseDown事件,但事件似乎没有在那里引发,仅在引用程序级别。

事件在装配器级别处理,但e.IsHandled未设置为true,因此应继续冒泡或隧道。从我读到的,PreviewMouseDown是隧道,而IIRC,它应该首先在用户控件中引发。

我错过了什么吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

鉴于您描述的结构,实际的可视树将如下所示:

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

如您所见,您的装饰工具(MyContentControlAdorner)位于树的不同分支中,而不是您的自定义控件。这是因为装饰者被放置在名为AdornerLayer的特殊元素中。此类AdornerLayer通常直接位于顶级元素内(例如WindowPage)。

因此,考虑到所有这些,应该很清楚,如果在装饰器中引发事件,它将通过以下路径进行隧道传输:Window -> AronerLayer -> MyContentControlAdorner

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