2011-04-20 74 views
1

嘿;我有一个用户控件以下视觉hyerarchy:无法处理PreviewMouseDown

网 - >帆布 - > MyContentControl

MyContentControl是自ContentControl派生的类,顶部有一个长方形的装饰器,这是为了更容易地点击某些对象(增加命中测试区域)。装饰者始终在场,但背景透明。

我希望看到PreviewMouseDown事件在我从UserControl的代码隐藏中点击MyContentControl时引发,但事件似乎没有在那里引发,仅在装饰者级别。

事件在adorner级别处理,但e.IsHandled未设置为true,所以它应该继续冒泡或隧道。从我所读到的,PreviewMouseDown是隧道,和IIRC,它应该先在用户控件中提出。

我错过了什么吗?

谢谢。

回答

3

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

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

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

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

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

+0

谢谢,现在已经很清楚了。 – 2011-04-20 19:38:43