예제 #1
0
        public static DependencyObject HitTestFirst(this Visual reference, HitTestParameters htParams, Predicate <DependencyObject> filter)
        {
            Contract.Requires(reference != null);
            Contract.Requires(htParams != null);
            Contract.Requires(filter != null);
            Contract.Ensures(Contract.Result <DependencyObject>() == null || filter(Contract.Result <DependencyObject>()));

            DependencyObject result = null;

            VisualTreeHelper.HitTest(
                reference,
                null,
                htResult =>
            {
                var visual = htResult.VisualHit;
                if (filter(visual))
                {
                    result = visual;
                    return(HitTestResultBehavior.Stop);
                }
                else
                {
                    return(HitTestResultBehavior.Continue);
                }
            },
                htParams);
            return(result);
        }
예제 #2
0
        public static IList <DependencyObject> HitTestAll(this Visual reference, HitTestParameters htParams, Predicate <DependencyObject> filter = null)
        {
            Contract.Requires(reference != null);
            Contract.Requires(htParams != null);
            Contract.Ensures(Contract.Result <IList <DependencyObject> >() != null);
            Contract.Ensures(filter == null || Contract.ForAll(Contract.Result <IList <DependencyObject> >(), d => filter(d)));

            // null filter means filter nothing (we return everything we can)
            if (filter == null)
            {
                filter = _ => true;
            }

            var result = new List <DependencyObject>();

            VisualTreeHelper.HitTest(
                reference,
                null,
                htResult =>
            {
                var visual = htResult.VisualHit;
                if (filter(visual))
                {
                    result.Add(visual);
                }
                return(HitTestResultBehavior.Continue);
            },
                htParams);
            return(result);
        }
예제 #3
0
        public static HitTestResult HitTest(Visual reference, HitTestParameters hitTestParameters, bool ignoreDisabled, HitTestFilterCallback filterCallback)
        {
            HitTestResult         hitTestResult  = (HitTestResult)null;
            HitTestResultCallback resultCallback = (HitTestResultCallback)(hitItemsResult =>
            {
                hitTestResult = hitItemsResult;
                return(HitTestResultBehavior.Stop);
            });
            HitTestFilterCallback filterCallback1 = (HitTestFilterCallback)(hit =>
            {
                UIElement uiElement = hit as UIElement;
                if (uiElement != null && (!uiElement.IsVisible || !uiElement.IsHitTestVisible || ignoreDisabled && !uiElement.IsEnabled))
                {
                    return(HitTestFilterBehavior.ContinueSkipSelfAndChildren);
                }
                HitTestFilterBehavior testFilterBehavior = HitTestFilterBehavior.Continue;
                if (filterCallback != null)
                {
                    testFilterBehavior = filterCallback(hit);
                }
                return(testFilterBehavior);
            });

            VisualTreeHelper.HitTest(reference, filterCallback1, resultCallback, hitTestParameters);
            return(hitTestResult);
        }
예제 #4
0
 public VisualHitTestArgs(Visual sourceAncestor, Visual child, HitTestParameters parameters)
 {
     if (sourceAncestor == null)
     {
         throw new ArgumentNullException("sourceAncestor");
     }
     if (child == null)
     {
         throw new ArgumentNullException("child");
     }
     this._sourceAncestor    = sourceAncestor;
     this._child             = child;
     this._hitTestParameters = parameters;
 }
예제 #5
0
        public RectangleHitTestResultTreeNode HitTest(HitTestParameters hitTestParameters)
        {
            PointHitTestParameters hitTestParameters1 = hitTestParameters as PointHitTestParameters;

            if (hitTestParameters1 != null)
            {
                return(this.HitTestPoint(hitTestParameters1.HitPoint));
            }
            GeometryHitTestParameters hitTestParameters2;

            if ((hitTestParameters2 = hitTestParameters as GeometryHitTestParameters) != null)
            {
                return(this.HitTestGeometry(hitTestParameters2.HitGeometry));
            }
            return((RectangleHitTestResultTreeNode)null);
        }
예제 #6
0
 /// <summary>
 /// Re-exposes the Visual base class's corresponding VisualTreeHelper implementation as public method.
 /// </summary>
 new public void HitTest(HitTestFilterCallback filterCallback, HitTestResultCallback resultCallback, HitTestParameters hitTestParameters)
 {
     base.HitTest(filterCallback, resultCallback, hitTestParameters);
 }
예제 #7
0
 public override ViewHitTestResult HitTest(Microsoft.Windows.Design.Interaction.ViewHitTestFilterCallback filterCallback, Microsoft.Windows.Design.Interaction.ViewHitTestResultCallback resultCallback, HitTestParameters hitTestParameters)
 {
     return((ViewHitTestResult)null);
 }
예제 #8
0
 public abstract ViewHitTestResult HitTest(ViewHitTestFilterCallback filterCallback, ViewHitTestResultCallback resultCallback, HitTestParameters hitTestParameters);
예제 #9
0
 public static void HitTestVisibleElements(Visual visual, HitTestResultCallback resultCallback, HitTestParameters parameters)
 {
     VisualTreeHelper.HitTest(visual, new HitTestFilterCallback(UtilityMethods.ExcludeNonVisualElements), resultCallback, parameters);
 }
예제 #10
0
 public static void HitTestVisibleElements(Visual visual, HitTestResultCallback resultCallback, HitTestParameters parameters)
 {
     VisualTreeHelper.HitTest(visual, ExcludeNonVisualElements, resultCallback, parameters);
 }
예제 #11
0
        public static HitTestResult HitTest(Visual root, HitTestFilterCallback filterCallback, HitTestResultCallback resultCallback, HitTestParameters hitTestParameters, HitTestFilterCallback modelCallback)
        {
            ModelHitTestHelper.HitTestFilterCallbackWrapper filterCallbackWrapper = new ModelHitTestHelper.HitTestFilterCallbackWrapper(filterCallback);
            ModelHitTestHelper.HitTestResultCallbackWrapper resultCallbackWrapper = new ModelHitTestHelper.HitTestResultCallbackWrapper(resultCallback, HitTestResultBehavior.Continue);
            VisualTreeHelper.HitTest(root, filterCallbackWrapper.FilterCallback, resultCallbackWrapper.ResultCallback, hitTestParameters);
            HitTestResult             topMostHit         = resultCallbackWrapper.TopMostHit;
            bool                      flag               = filterCallback == null && resultCallback == null;
            VisualHitTestArgs         args               = new VisualHitTestArgs(root, root, hitTestParameters);
            PointHitTestParameters    hitTestParameters1 = hitTestParameters as PointHitTestParameters;
            GeometryHitTestParameters hitTestParameters2 = hitTestParameters as GeometryHitTestParameters;

            foreach (DependencyObject dependencyObject in ModelHitTestHelper.GetDescendantsInZOrder((DependencyObject)root))
            {
                if (dependencyObject != null)
                {
                    if (filterCallback == null && topMostHit != null && dependencyObject == topMostHit.VisualHit)
                    {
                        resultCallbackWrapper.PlayResults();
                        return(resultCallbackWrapper.TopMostHit);
                    }
                    Visual          visual            = dependencyObject as Visual;
                    HitTestProvider singletonProvider = ModelHitTestHelper.GetSingletonProvider(dependencyObject);
                    if (singletonProvider != null && (modelCallback == null || modelCallback((DependencyObject)visual) != HitTestFilterBehavior.Continue))
                    {
                        args.UpdateChild(dependencyObject);
                        HitTestResult result = (HitTestResult)null;
                        if (hitTestParameters1 != null && visual != null)
                        {
                            PointHitTestResult pointHitTestResult = singletonProvider.HitTestPoint(args);
                            if (pointHitTestResult != null && pointHitTestResult.VisualHit != null)
                            {
                                result = (HitTestResult)pointHitTestResult;
                            }
                        }
                        else if (hitTestParameters2 != null && visual != null)
                        {
                            GeometryHitTestResult geometryHitTestResult = singletonProvider.HitTestGeometry(args);
                            if (geometryHitTestResult != null && geometryHitTestResult.IntersectionDetail != IntersectionDetail.Empty && geometryHitTestResult.IntersectionDetail != IntersectionDetail.NotCalculated)
                            {
                                result = (HitTestResult)geometryHitTestResult;
                            }
                        }
                        if (result != null)
                        {
                            HitTestFilterBehavior testFilterBehavior = filterCallbackWrapper.FilterCallback(dependencyObject);
                            switch (testFilterBehavior)
                            {
                            case HitTestFilterBehavior.Continue:
                            case HitTestFilterBehavior.Stop:
                                resultCallbackWrapper.InsertResult(result);
                                break;
                            }
                            if (flag && testFilterBehavior != HitTestFilterBehavior.ContinueSkipSelf || testFilterBehavior == HitTestFilterBehavior.Stop)
                            {
                                resultCallbackWrapper.PlayResults();
                                return(result);
                            }
                        }
                    }
                }
            }
            resultCallbackWrapper.PlayResults();
            return(resultCallbackWrapper.TopMostHit);
        }