Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the Silverlight's FindElementsInHostCoordinates equivalent in WPF?

I would like to perform a rectangual hit test on WPF Canvas component in order to get Controls that are overlapped by a Rectangle framework element. I found a Silverlight's VisualTreeHelper.FindElementsInHostCoordinates method, but apparently it's not available in WPF.

What's the best method to achieve such functionality?

like image 823
Darius Avatar asked Jan 13 '10 19:01

Darius


2 Answers

The closest equivalent is VisualTreeHelper.HitTest. It works significantly differently to Silverlight's FindElementsInHostCoordinates, but you should be able to use it for your needs.

like image 124
KeithMahoney Avatar answered Sep 28 '22 13:09

KeithMahoney


Supposing you have a call like this in Silverlight

var result = VisualTreeHelper.FindElementsInHostCoordinates(myPoint, myUIElement);

then this WPF code should have an equivalent result

var result = new List<DependencyObject>(); 
                         //changed from external edits, because VisualHit is
                         //only a DependencyObject and may not be a UIElement
                         //this could cause exceptions or may not be compiling at all
                         //simply filter the result for class UIElement and
                         //cast it to IEnumerable<UIElement> if you need
                         //the very exact same result including type

VisualTreeHelper.HitTest(
    myUiElement,
    null,
    new HitTestResultCallback(
        (HitTestResult hit)=>{
            result.Add(hit.VisualHit);
            return HitTestResultBehavior.Continue;
        }),
    new PointHitTestParameters(myPoint));

in your special case you might want to use GeometryHitTestParameters instead of PointHitTestParameters to do a Rect-Test.

like image 31
thewhiteambit Avatar answered Sep 28 '22 14:09

thewhiteambit