Exemplo n.º 1
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);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Filter for hit testing.  In the case that the hidden visual has capture
        /// then all Visual3Ds are skipped except for the one it is on.  This gives the
        /// same behavior as capture in the 2D case.
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public HitTestFilterBehavior InteractiveMV3DFilter(DependencyObject o)
        {
            // by default everything is ok
            HitTestFilterBehavior behavior = HitTestFilterBehavior.Continue;

            // if the hidden visual has mouse capture - then we only want to test against
            // the IMV3D that has capture
            if (o is Visual3D && _mouseCaptureInHiddenVisual)
            {
                if (o is InteractiveVisual3D)
                {
                    InteractiveVisual3D imv3D = (InteractiveVisual3D)o;

                    if (imv3D.InternalVisual != _hiddenVisual.Child)
                    {
                        behavior = HitTestFilterBehavior.ContinueSkipSelf;
                    }
                }
                else
                {
                    behavior = HitTestFilterBehavior.ContinueSkipSelf;
                }
            }

            return(behavior);
        }
Exemplo n.º 3
0
        private static bool DoEnumerateTree(object reference, EnumerateTreeFilterCallback filterCallback, EnumerateTreeResultCallback enumeratorCallback, object misc)
        {
            for (int i = 0; i < CommonTreeHelper.GetChildrenCount(reference); ++i)
            {
                object child = CommonTreeHelper.GetChild(reference, i);

                HitTestFilterBehavior filterResult = HitTestFilterBehavior.Continue;
                if (filterCallback != null)
                {
                    filterResult = filterCallback(child, misc);
                }

                bool enumerateSelf     = true;
                bool enumerateChildren = true;

                switch (filterResult)
                {
                case HitTestFilterBehavior.Continue:
                    break;

                case HitTestFilterBehavior.ContinueSkipChildren:
                    enumerateChildren = false;
                    break;

                case HitTestFilterBehavior.ContinueSkipSelf:
                    enumerateSelf = false;
                    break;

                case HitTestFilterBehavior.ContinueSkipSelfAndChildren:
                    enumerateChildren = false;
                    enumerateSelf     = false;
                    break;

                default:
                    return(false);
                }

                if
                (
                    (enumerateSelf && enumeratorCallback != null && enumeratorCallback(child, misc) == HitTestResultBehavior.Stop) ||
                    (enumerateChildren && !DoEnumerateTree(child, filterCallback, enumeratorCallback, misc))
                )
                {
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 4
0
            private HitTestFilterBehavior OnFilterHitResult(DependencyObject hit)
            {
                UIElement uiElement = hit as UIElement;

                if (uiElement != null && !uiElement.IsVisible)
                {
                    return(HitTestFilterBehavior.ContinueSkipSelfAndChildren);
                }
                HitTestFilterBehavior testFilterBehavior = HitTestFilterBehavior.Continue;

                if (this._filterCallback != null)
                {
                    testFilterBehavior = this._filterCallback(hit);
                }
                return(testFilterBehavior);
            }
Exemplo n.º 5
0
 internal static bool SkipSubgraph(HitTestFilterBehavior behavior)
 {
     return(behavior == HitTestFilterBehavior.ContinueSkipSelfAndChildren);
 }
Exemplo n.º 6
0
 internal static bool Stop(HitTestFilterBehavior behavior)
 {
     return((((int)behavior) & c_Stop) == c_Stop);
 }
Exemplo n.º 7
0
 internal static bool IncludeChildren(HitTestFilterBehavior behavior)
 {
     return((((int)behavior) & c_IncludeChidren) == c_IncludeChidren);
 }
Exemplo n.º 8
0
 internal static bool DoHitTest(HitTestFilterBehavior behavior)
 {
     return((((int)behavior) & c_DoHitTest) == c_DoHitTest);
 }
Exemplo n.º 9
0
 internal static bool SkipSubgraph(HitTestFilterBehavior behavior)
 { 
     return behavior == HitTestFilterBehavior.ContinueSkipSelfAndChildren;
 }
Exemplo n.º 10
0
 internal static bool Stop(HitTestFilterBehavior behavior)
 { 
     return (((int)behavior) & c_Stop) == c_Stop;
 } 
Exemplo n.º 11
0
 internal static bool IncludeChildren(HitTestFilterBehavior behavior) 
 {
     return (((int)behavior) & c_IncludeChidren) == c_IncludeChidren; 
 }
Exemplo n.º 12
0
 internal static bool DoHitTest(HitTestFilterBehavior behavior)
 {
     return (((int)behavior) & c_DoHitTest) == c_DoHitTest; 
 }
Exemplo n.º 13
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);
        }