WPF 获取鼠标下的元素(们)

37

在WPF中,有没有一种方法可以在MouseMove事件中获取鼠标下的元素数组?

3个回答

47

您也可以尝试使用Mouse.DirectlyOver属性来获取鼠标下最上层的元素。


这并不会提供鼠标下的元素数组,而只会返回最上层的元素。 - O. R. Mapper
当在 ListControl 中使用时,这会返回 null。很奇怪。 - Martien de Jong
2
一个注意点 - Mouse.Capture(...)Mouse.PreviewMouseDownOutsideCapturedElementEvent 无法正常工作:如果一个元素拥有鼠标捕获,那么无论鼠标指针在哪里,它都被视为直接位于该元素上方。 - aderesh
Mouse.Capture(...)Mouse.DirectlyOver相关问题 - https://stackoverflow.com/questions/5399357/how-can-i-get-the-element-at-the-mouse-position-even-when-the-mouse-is-captured?lq=1 - aderesh

41

来自 "WPF Unleashed" 第383页:

可视化命中测试可以告诉您有关与位置相交的所有Visual,[...] 您必须使用 [...] 接受HitTestResultCallback委托的[VisualTreeHelper.]HitTest方法。在此版本的HitTest返回之前,对于每个相关的Visual,从上到下依次调用委托。

此类回调的签名为

HitTestResultBehavior Callback(HitTestResult result)

并且它必须返回HitTestResultBehaviour.Continue以接收进一步的命中,如下所示(来自MSDN链接页面):

// Return the result of the hit test to the callback.
public HitTestResultBehavior MyHitTestResult(HitTestResult result)
{
    // Add the hit test result to the list that will be processed after the enumeration.
    hitResultsList.Add(result.VisualHit);

    // Set the behavior to return visuals at all z-order levels.
    return HitTestResultBehavior.Continue;
}

如需更多信息,请查阅VisualTreeHelper.HitTest的MSDN文档


6
请参阅以下 MSDN 链接(部分:使用命中测试结果回调)以获取一个很好的示例。http://msdn.microsoft.com/en-us/library/ms752097.aspx - Mike Fuchs
1
请注意,您会得到一个视觉树元素,这通常不是您所需的。您必须递归地通过命中元素的父级进行搜索,以获取您的逻辑视图元素。 - henon

4

在链接的示例中使用的重载(应该直接复制到答案中),虽然只能找到鼠标位置最顶部的元素,但不能找到鼠标下的元素数组。 - O. R. Mapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接