Example #1
0
        /// <summary>
        /// Determine if the given point is on an adorner.
        /// </summary>
        /// <param name="point">point to test</param>
        /// <returns>AdornerHitTestResult containing the hit visual and the adorner that visual
        /// is part of.  If the no adorner was hit, null is returned</returns>
        public AdornerHitTestResult AdornerHitTest(Point point)
        {
            PointHitTestResult result = VisualTreeUtils.AsNearestPointHitTestResult(VisualTreeHelper.HitTest(this, point, false));

            if (result != null && result.VisualHit != null)
            {
                Visual visual = result.VisualHit;

                while (visual != this)
                {
                    if (visual is Adorner)
                    {
                        return(new AdornerHitTestResult(result.VisualHit, result.PointHit, visual as Adorner));
                    }

                    // we intentionally separate adorners from spanning 3D boundaries
                    // and if the parent is ever 3D there was a mistake
                    visual = (Visual)VisualTreeHelper.GetParent(visual);
                }

                return(null);
            }
            else
            {
                return(null);
            }
        }
Example #2
0
        private Adorner GetHitAdorner(Visual visual, Point point, Type[] adornerFilterTypes)
        {
            PointHitTestResult    hitTestResult  = (PointHitTestResult)null;
            HitTestFilterCallback filterCallback = (HitTestFilterCallback)(testObject =>
            {
                foreach (Type type in adornerFilterTypes)
                {
                    if (type.IsInstanceOfType((object)testObject))
                    {
                        return(HitTestFilterBehavior.Continue);
                    }
                }
                return(HitTestFilterBehavior.ContinueSkipSelf);
            });
            HitTestResultCallback resultCallback = (HitTestResultCallback)(hitItemsResult =>
            {
                hitTestResult = (PointHitTestResult)hitItemsResult;
                return(HitTestResultBehavior.Stop);
            });
            PointHitTestParameters hitTestParameters = new PointHitTestParameters(point);

            VisualTreeHelper.HitTest(visual, filterCallback, resultCallback, (HitTestParameters)hitTestParameters);
            Adorner adorner = (Adorner)null;

            if (hitTestResult != null)
            {
                adorner = hitTestResult.VisualHit as Adorner;
            }
            return(adorner);
        }
Example #3
0
        /// <summary>
        ///     Converts the given point or ray hit test result into a PointHitTestResult.
        ///     In the case of a RayHitTestResult this is done by walking up the
        ///     transforming the 3D intersection into the coordinate space of the
        ///     Viewport3DVisual which contains the Visual3D subtree.
        /// </summary>
        internal static PointHitTestResult AsNearestPointHitTestResult(HitTestResult result)
        {
            if (result == null)
            {
                return(null);
            }

            PointHitTestResult resultAsPointHitTestResult = result as PointHitTestResult;

            if (resultAsPointHitTestResult != null)
            {
                return(resultAsPointHitTestResult);
            }

            RayHitTestResult resultAsRayHitTestResult = result as RayHitTestResult;

            if (resultAsRayHitTestResult != null)
            {
                Visual3D current        = (Visual3D)resultAsRayHitTestResult.VisualHit;
                Matrix3D worldTransform = Matrix3D.Identity;

                while (true)
                {
                    if (current.Transform != null)
                    {
                        worldTransform.Append(current.Transform.Value);
                    }

                    Visual3D parent3D = current.InternalVisualParent as Visual3D;

                    if (parent3D == null)
                    {
                        break;
                    }

                    current = parent3D;
                }

                Viewport3DVisual viewport = current.InternalVisualParent as Viewport3DVisual;

                if (viewport != null)
                {
                    Point4D worldPoint    = ((Point4D)resultAsRayHitTestResult.PointHit) * worldTransform;
                    Point   viewportPoint = viewport.WorldToViewport(worldPoint);

                    return(new PointHitTestResult(viewport, viewportPoint));
                }

                Debug.Fail("How did a ray hit a Visual3D not parented to a Viewport3DVisual?");

                return(null);
            }

            Debug.Fail(String.Format("Unhandled HitTestResult type '{0}'", result.GetType().Name));

            return(null);
        }
        public HitTestResultBehavior HitTestResultHandler(HitTestResult result)
        {
            PointHitTestResult hitResult = (PointHitTestResult)result;

            if (result.VisualHit != CanvasMain)
            {
                hitList.Add((Visual)result.VisualHit);
                return(HitTestResultBehavior.Continue);
            }
            return(HitTestResultBehavior.Stop);
        }
Example #5
0
        internal static Visual GetElementFromPoint(IntPtr hwnd, Visual root, Point pointScreen)
        {
            HwndSource hwndSource = HwndSource.CriticalFromHwnd(hwnd);

            if (hwndSource == null)
            {
                return(null);
            }

            Point pointClient         = PointUtil.ScreenToClient(pointScreen, hwndSource);
            Point pointRoot           = PointUtil.ClientToRoot(pointClient, hwndSource);
            PointHitTestResult result = VisualTreeUtils.AsNearestPointHitTestResult(VisualTreeHelper.HitTest(root, pointRoot));
            Visual             visual = (result != null) ? result.VisualHit : null;


            return(visual);
        }
Example #6
0
        /// <summary>Gets an <see cref="T:System.Windows.Media.AdornerHitTestResult" /> for a specified point.</summary>
        /// <param name="point">The point to hit test.</param>
        /// <returns>An <see cref="T:System.Windows.Media.AdornerHitTestResult" /> for the specified point.</returns>
        // Token: 0x06002AB0 RID: 10928 RVA: 0x000C2FA0 File Offset: 0x000C11A0
        public AdornerHitTestResult AdornerHitTest(Point point)
        {
            PointHitTestResult pointHitTestResult = VisualTreeUtils.AsNearestPointHitTestResult(VisualTreeHelper.HitTest(this, point, false));

            if (pointHitTestResult != null && pointHitTestResult.VisualHit != null)
            {
                for (Visual visual = pointHitTestResult.VisualHit; visual != this; visual = (Visual)VisualTreeHelper.GetParent(visual))
                {
                    if (visual is Adorner)
                    {
                        return(new AdornerHitTestResult(pointHitTestResult.VisualHit, pointHitTestResult.PointHit, visual as Adorner));
                    }
                }
                return(null);
            }
            return(null);
        }
        public HitTestResultBehavior MyCallback(HitTestResult result)
        {
            PointHitTestResult pointHit = result as PointHitTestResult;

            if (pointHit != null)
            {
                Console.WriteLine("Hit: " + pointHit.PointHit.X / ActualWidth + "; " + (ActualHeight - pointHit.PointHit.Y) / ActualHeight);
            }
            if (result.VisualHit.GetType() == typeof(System.Windows.Media.DrawingVisual))
            {
                if (pointHit != null)
                {
                    dragStart = pointHit.PointHit;
                }
                this.CaptureMouse();
            }

            return(HitTestResultBehavior.Stop);
        }
Example #8
0
        protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
        {
            var p        = MousePositionArea(hitTestParameters.HitPoint);
            var hitStart = _model.HotSpotStart.IntersectsWith(p);
            var hitEnd   = _model.HotSpotEnd.IntersectsWith(p);

            _hitWaypoint = -1;
            for (int i = 0; i < _model.Waypoints.Count; i++)
            {
                if (_model.Waypoints[i].Bounds.IntersectsWith(p))
                {
                    _hitWaypoint = i;
                    break;
                }
            }
            if (hitStart || hitEnd || _hitWaypoint >= 0)
            {
                var result = new PointHitTestResult(this, hitTestParameters.HitPoint);
                InvalidateVisual();
                return(result);
            }
            return(null);
        }
Example #9
0
 public HitTestResultBehavior InputHitTestResultCallback(PointHitTestResult result)
 {
     HitTestResult = result;
     return(HitTestResultBehavior.Stop);
 }
Example #10
0
        private void InputHitTest(Point pt, out IInputElement enabledHit, out IInputElement rawHit, out PointHitTestResult rawHitResult)
        {
            var hitTestParameters  = new PointHitTestParameters(pt);
            var inputHitTestResult = new InputHitTestResult();

            VisualTreeHelper.HitTest(this, hitTestParameters, InputHitTestFilterCallback, inputHitTestResult.InputHitTestResultCallback);
            var visualHit = inputHitTestResult.Result;

            rawHit       = (visualHit as IInputElement);
            rawHitResult = inputHitTestResult.HitTestResult;
            enabledHit   = null;
            while (visualHit != null)
            {
                var uIElement = visualHit as UIElement;
                if (uIElement != null)
                {
                    if (rawHit == null)
                    {
                        rawHit       = uIElement;
                        rawHitResult = null;
                    }
                    if (uIElement.IsEnabled)
                    {
                        enabledHit = uIElement;
                        return;
                    }
                }
                if (visualHit == this)
                {
                    break;
                }
                visualHit = visualHit.Parent;
            }
        }
Example #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);
        }