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); }
/// <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); }
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); }
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); }
internal static bool SkipSubgraph(HitTestFilterBehavior behavior) { return(behavior == HitTestFilterBehavior.ContinueSkipSelfAndChildren); }
internal static bool Stop(HitTestFilterBehavior behavior) { return((((int)behavior) & c_Stop) == c_Stop); }
internal static bool IncludeChildren(HitTestFilterBehavior behavior) { return((((int)behavior) & c_IncludeChidren) == c_IncludeChidren); }
internal static bool DoHitTest(HitTestFilterBehavior behavior) { return((((int)behavior) & c_DoHitTest) == c_DoHitTest); }
internal static bool SkipSubgraph(HitTestFilterBehavior behavior) { return behavior == HitTestFilterBehavior.ContinueSkipSelfAndChildren; }
internal static bool Stop(HitTestFilterBehavior behavior) { return (((int)behavior) & c_Stop) == c_Stop; }
internal static bool IncludeChildren(HitTestFilterBehavior behavior) { return (((int)behavior) & c_IncludeChidren) == c_IncludeChidren; }
internal static bool DoHitTest(HitTestFilterBehavior behavior) { return (((int)behavior) & c_DoHitTest) == c_DoHitTest; }
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); }