/// <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); } }
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); }
/// <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); }
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); }
/// <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); }
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); }
public HitTestResultBehavior InputHitTestResultCallback(PointHitTestResult result) { HitTestResult = result; return(HitTestResultBehavior.Stop); }
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; } }
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); }