WPF Get Element(s) under mouse
Asked Answered
H

3

37

Is there a way with WPF to get an array of elements under the mouse on a MouseMove event?

Hobby answered 5/9, 2008 at 13:28 Comment(0)
F
41

From "WPF Unleashed", page 383:

Visual hit testing can inform you about all Visuals that intersect a location, [...] you must use [...] the [VisualTreeHelper.]HitTest method that accepts a HitTestResultCallback delegate. Before this version of HitTest returns, the delegate is invoked once for each relevant Visual, starting from the topmost and ending at the bottommost.

The signature of such a callback is

HitTestResultBehavior Callback(HitTestResult result)

and it has to return HitTestResultBehaviour.Continue to receive further hits, as shown below (from the linked page on 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;
}

For further information, please consult the MSDN documentation for VisualTreeHelper.HitTest.

Fiddling answered 8/10, 2008 at 11:59 Comment(2)
See the following msdn link (section: Using a Hit Test Result Callback) for a good example. http://msdn.microsoft.com/en-us/library/ms752097.aspxFlash
Note that you get a visual tree element which most of the time is not what you need. You have to search up through the parents of the hits recursively to get your logical view elements.Wilbanks
C
47

You can also try using the Mouse.DirectlyOver property to get the top-most element that is under the mouse.

Chaparro answered 5/9, 2008 at 21:21 Comment(4)
This will not provide an array of elements under the mouse, though, but indeed only return the topmost element.Piezoelectricity
for me this returns null when used in a ListControl. weird.Reflect
one note - doesn't work with Mouse.Capture(...) and Mouse.PreviewMouseDownOutsideCapturedElementEvent : If an element has mouse capture, the mouse pointer is considered directly over the element regardless of the where the mouse pointer is.Papilloma
Mouse.Capture(...) and Mouse.DirectlyOver related question - #5399857Papilloma
F
41

From "WPF Unleashed", page 383:

Visual hit testing can inform you about all Visuals that intersect a location, [...] you must use [...] the [VisualTreeHelper.]HitTest method that accepts a HitTestResultCallback delegate. Before this version of HitTest returns, the delegate is invoked once for each relevant Visual, starting from the topmost and ending at the bottommost.

The signature of such a callback is

HitTestResultBehavior Callback(HitTestResult result)

and it has to return HitTestResultBehaviour.Continue to receive further hits, as shown below (from the linked page on 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;
}

For further information, please consult the MSDN documentation for VisualTreeHelper.HitTest.

Fiddling answered 8/10, 2008 at 11:59 Comment(2)
See the following msdn link (section: Using a Hit Test Result Callback) for a good example. http://msdn.microsoft.com/en-us/library/ms752097.aspxFlash
Note that you get a visual tree element which most of the time is not what you need. You have to search up through the parents of the hits recursively to get your logical view elements.Wilbanks
T
4

Can you use the VisualTreeHelper.HitTest ?

http://lukieb.blogspot.com/2008/07/visualtreehelperhittest.html

Tetter answered 5/9, 2008 at 13:30 Comment(1)
The overload used in the linked example (which should probably be replicated directly in the answer, as well) will only find the topmost element at the mouse location, though, not an array of elements under the mouse.Piezoelectricity

© 2022 - 2024 — McMap. All rights reserved.