【问题标题】:Not able to handle PreviewMouseDown无法处理 PreviewMouseDown
【发布时间】:2011-04-20 18:35:32
【问题描述】:

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

网格 -> 画布 -> MyContentControl

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

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

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

我错过了什么吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    根据您描述的结构,实际的可视化树将如下所示:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 2020-02-26
      • 2020-07-01
      相关资源
      最近更新 更多