/// <summary> /// Private helper that takes an element and transforms it's 4 points /// into the InkCanvas's space /// </summary> private static ElementCornerPoints GetTransformedElementCornerPoints(InkCanvasInnerCanvas canvas, UIElement childElement) { Debug.Assert(canvas != null); Debug.Assert(childElement != null); Debug.Assert(canvas.CheckAccess()); ElementCornerPoints elementPoints = new ElementCornerPoints(); elementPoints.Set = false; if (childElement.Visibility != Visibility.Visible) { // // this little one's not worth it... // return(elementPoints); } // // get the transform from us to our parent InkCavas // GeneralTransform parentTransform = childElement.TransformToAncestor(canvas); // parentTransform.TryTransform(new Point(0, 0), out elementPoints.UpperLeft); parentTransform.TryTransform(new Point(childElement.RenderSize.Width, 0), out elementPoints.UpperRight); parentTransform.TryTransform(new Point(0, childElement.RenderSize.Height), out elementPoints.LowerLeft); parentTransform.TryTransform(new Point(childElement.RenderSize.Width, childElement.RenderSize.Height), out elementPoints.LowerRight); elementPoints.Set = true; return(elementPoints); }
/// <summary> /// Private helper that will generate a grid of points 5 px apart given the elements bounding points /// this works with any affline transformed points /// </summary> private Point[] GeneratePointGrid(ElementCornerPoints elementPoints) { if (!elementPoints.Set) { return(new Point[] {}); } ArrayList pointArray = new ArrayList(); UpdatePointDistances(elementPoints); // // add our original points // pointArray.Add(elementPoints.UpperLeft); pointArray.Add(elementPoints.UpperRight); FillInPoints(pointArray, elementPoints.UpperLeft, elementPoints.UpperRight); pointArray.Add(elementPoints.LowerLeft); pointArray.Add(elementPoints.LowerRight); FillInPoints(pointArray, elementPoints.LowerLeft, elementPoints.LowerRight); FillInGrid(pointArray, elementPoints.UpperLeft, elementPoints.UpperRight, elementPoints.LowerRight, elementPoints.LowerLeft); Point[] retPointArray = new Point[pointArray.Count]; pointArray.CopyTo(retPointArray); return(retPointArray); }
/// <summary> /// Private helper that takes an element and transforms it's 4 points /// into the InkCanvas's space /// </summary> private static ElementCornerPoints GetTransformedElementCornerPoints(InkCanvasInnerCanvas canvas, UIElement childElement) { Debug.Assert(canvas != null); Debug.Assert(childElement != null); Debug.Assert(canvas.CheckAccess()); ElementCornerPoints elementPoints = new ElementCornerPoints(); elementPoints.Set = false; if (childElement.Visibility != Visibility.Visible) { // // this little one's not worth it... // return(elementPoints); } // // get the transform from us to our parent InkCavas // GeneralTransform parentTransform = childElement.TransformToAncestor(canvas); // REVIEW: any of the methods below may not actually perform the transformation // Do we need to do anything special in that scenario? parentTransform.TryTransform(new Point(0, 0), out elementPoints.UpperLeft); parentTransform.TryTransform(new Point(childElement.RenderSize.Width, 0), out elementPoints.UpperRight); parentTransform.TryTransform(new Point(0, childElement.RenderSize.Height), out elementPoints.LowerLeft); parentTransform.TryTransform(new Point(childElement.RenderSize.Width, childElement.RenderSize.Height), out elementPoints.LowerRight); elementPoints.Set = true; return(elementPoints); }
/// <summary> /// Private helper that will turn an element in any nesting level into a stroke /// in the InkCanvas's coordinate space. This method calls itself recursively /// </summary> private void HitTestElement(InkCanvasInnerCanvas parent, UIElement uiElement, List <UIElement> elementsToSelect) { ElementCornerPoints elementPoints = LassoSelectionBehavior.GetTransformedElementCornerPoints(parent, uiElement); if (elementPoints.Set != false) { Point[] points = GeneratePointGrid(elementPoints); // // perform hit testing against our lasso // System.Diagnostics.Debug.Assert(null != _lassoHelper); if (_lassoHelper.ArePointsInLasso(points, _percentIntersectForElements)) { elementsToSelect.Add(uiElement); } } // // we used to recurse into the childrens children. That is no longer necessary // }
/// <summary> /// Used to calc the diff between points on the x and y axis /// </summary> private void UpdatePointDistances(ElementCornerPoints elementPoints) { // // calc the x and y diffs // double width = elementPoints.UpperLeft.X - elementPoints.UpperRight.X; if (width < 0) { width = -width; } double height = elementPoints.UpperLeft.Y - elementPoints.LowerLeft.Y; if (height < 0) { height = -height; } _xDiff = width * 0.25f; if (_xDiff > _maxThreshold) { _xDiff = _maxThreshold; } else if (_xDiff < _minThreshold) { _xDiff = _minThreshold; } _yDiff = height * 0.25f; if (_yDiff > _maxThreshold) { _yDiff = _maxThreshold; } else if (_yDiff < _minThreshold) { _yDiff = _minThreshold; } }
/// <summary> /// Private helper that will generate a grid of points 5 px apart given the elements bounding points /// this works with any affline transformed points /// </summary> private Point[] GeneratePointGrid(ElementCornerPoints elementPoints) { if (!elementPoints.Set) { return new Point[]{}; } ArrayList pointArray = new ArrayList(); UpdatePointDistances(elementPoints); // // add our original points // pointArray.Add(elementPoints.UpperLeft); pointArray.Add(elementPoints.UpperRight); FillInPoints(pointArray, elementPoints.UpperLeft, elementPoints.UpperRight); pointArray.Add(elementPoints.LowerLeft); pointArray.Add(elementPoints.LowerRight); FillInPoints(pointArray, elementPoints.LowerLeft, elementPoints.LowerRight); FillInGrid( pointArray, elementPoints.UpperLeft, elementPoints.UpperRight, elementPoints.LowerRight, elementPoints.LowerLeft); Point[] retPointArray = new Point[pointArray.Count]; pointArray.CopyTo(retPointArray); return retPointArray; }
/// <summary> /// Private helper that takes an element and transforms it's 4 points /// into the InkCanvas's space /// </summary> private static ElementCornerPoints GetTransformedElementCornerPoints(InkCanvasInnerCanvas canvas, UIElement childElement) { Debug.Assert(canvas != null); Debug.Assert(childElement != null); Debug.Assert(canvas.CheckAccess()); ElementCornerPoints elementPoints = new ElementCornerPoints(); elementPoints.Set = false; if (childElement.Visibility != Visibility.Visible) { // // this little one's not worth it... // return elementPoints; } // // get the transform from us to our parent InkCavas // GeneralTransform parentTransform = childElement.TransformToAncestor(canvas); // parentTransform.TryTransform(new Point(0, 0), out elementPoints.UpperLeft); parentTransform.TryTransform(new Point(childElement.RenderSize.Width, 0), out elementPoints.UpperRight); parentTransform.TryTransform(new Point(0, childElement.RenderSize.Height), out elementPoints.LowerLeft); parentTransform.TryTransform(new Point(childElement.RenderSize.Width, childElement.RenderSize.Height), out elementPoints.LowerRight); elementPoints.Set = true; return elementPoints; }