1

嘿; 我在用户控件中有以下视觉层次结构:

网格 -> 画布 -> MyContentControl

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

我希望看到当我从用户控件的代码隐藏中单击 MyContentControl 时引发的 PreviewMouseDown 事件,但该事件似乎没有在那里引发,只是在装饰者级别。

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

我错过了什么吗?

谢谢你。

4

1 回答 1

3

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

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

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

因此,考虑到所有这些,应该清楚的是,如果在装饰器中引发了一个事件,它将通过以下路径隧道:Window -> AronerLayer -> MyContentControlAdorner.

话虽如此,您无法在位于不同子树中的两个元素上处理鼠标事件(即使它们一个在另一个之上)。

于 2011-04-20T18:54:06.497 回答