我有一个WPF ParentUserControl
和一些 ChildUserControlA
ChildUserControlB
等(也是WPF控件)
ChildUserControl
是包含一些其他基本元素(文本框,标签等)的控件
在主窗体的状态栏中,我需要显示当前鼠标覆盖的ChildUserControl的名称 .
所以,在ParentUserControl的MouseMove中,我获得了一个对象 myElement = Mouse.DirectlyOver
,因为我需要 ChildUserControl 's, but I obtain instead a ' System.Windows.Controls.TextBlock'(ChildUserControl的一部分)的最顶层...
如何解决?
当我在MyChildControl上鼠标时,我需要检测到MyChildControl,而不是它的子元素 .
按照以下顺序,我在MyChildControl上使用了以下内容:
Protected Overrides Function HitTestCore(
hitTestParameters As PointHitTestParameters) As HitTestResult
Return New PointHitTestResult(Me, hitTestParameters.HitPoint)
End Function
但无论如何我有时会得到文本块,有时是ChildUserControl ......
2 回答
另一个答案可能是这样的 - 定义您关心的对象的确切类型,然后处理可视树,直到找到它们:
你需要实现Hit-Testing . 因此,如果要获取区域内的所有元素,可以使用HitTestResultCallback . 一个例子:
这样,Elements列表包含GeometryHitTestResult.IntersectionDetail指定的所有元素,如果你想(例如)知道鼠标位置下的元素(MouseDown Event),只需这样做:
这就是我在评论中的意思: