Search code examples
wpfelementvisualtreehelpervisual-tree

WPF Get Element(s) under mouse


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


Solution

  • 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.