public CroppingAdorner(UIElement adornedElement, Rect rcInit) : base(adornedElement) { _cropMask = new PuncturedRect { IsHitTestVisible = false, Interior = rcInit, Fill = Fill }; _thumbCanvas = new Canvas { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch }; _visualCollection = new VisualCollection(this) { _cropMask, _thumbCanvas }; BuildCorner(ref _thumbTop, Cursors.SizeNS); BuildCorner(ref _thumbBottom, Cursors.SizeNS); BuildCorner(ref _thumbLeft, Cursors.SizeWE); BuildCorner(ref _thumbRight, Cursors.SizeWE); BuildCorner(ref _thumbTopLeft, Cursors.SizeNWSE); BuildCorner(ref _thumbTopRight, Cursors.SizeNESW); BuildCorner(ref _thumbBottomLeft, Cursors.SizeNESW); BuildCorner(ref _thumbBottomRight, Cursors.SizeNWSE); BuildCenter(ref _thumbCenter); //Cropping handlers. _thumbBottomLeft.DragDelta += HandleBottomLeft; _thumbBottomRight.DragDelta += HandleBottomRight; _thumbTopLeft.DragDelta += HandleTopLeft; _thumbTopRight.DragDelta += HandleTopRight; _thumbTop.DragDelta += HandleTop; _thumbBottom.DragDelta += HandleBottom; _thumbRight.DragDelta += HandleRight; _thumbLeft.DragDelta += HandleLeft; _thumbCenter.DragDelta += HandleCenter; //Clipping interior should be withing the bounds of the adorned element. var element = adornedElement as FrameworkElement; if (element != null) { element.SizeChanged += AdornedElement_SizeChanged; } }
private static object CoerceRectInterior(DependencyObject d, object value) { PuncturedRect pr = (PuncturedRect)d; Rect rcExterior = pr.Exterior; Rect rcProposed = (Rect)value; double left = Math.Max(rcProposed.Left, rcExterior.Left); double top = Math.Max(rcProposed.Top, rcExterior.Top); double width = Math.Min(rcProposed.Right, rcExterior.Right) - left; double height = Math.Min(rcProposed.Bottom, rcExterior.Bottom) - top; rcProposed = new Rect(left, top, width, height); return(rcProposed); }
public CroppingAdorner(UIElement adornedElement, Rect rcInit) : base(adornedElement) { _cropMask = new PuncturedRect { IsHitTestVisible = false, Interior = rcInit, Fill = Fill }; _thumbCanvas = new Canvas { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch }; _visualCollection = new VisualCollection(this) { _cropMask, _thumbCanvas}; BuildCorner(ref _thumbTop, Cursors.SizeNS); BuildCorner(ref _thumbBottom, Cursors.SizeNS); BuildCorner(ref _thumbLeft, Cursors.SizeWE); BuildCorner(ref _thumbRight, Cursors.SizeWE); BuildCorner(ref _thumbTopLeft, Cursors.SizeNWSE); BuildCorner(ref _thumbTopRight, Cursors.SizeNESW); BuildCorner(ref _thumbBottomLeft, Cursors.SizeNESW); BuildCorner(ref _thumbBottomRight, Cursors.SizeNWSE); //Cropping handlers. _thumbBottomLeft.DragDelta += HandleBottomLeft; _thumbBottomRight.DragDelta += HandleBottomRight; _thumbTopLeft.DragDelta += HandleTopLeft; _thumbTopRight.DragDelta += HandleTopRight; _thumbTop.DragDelta += HandleTop; _thumbBottom.DragDelta += HandleBottom; _thumbRight.DragDelta += HandleRight; _thumbLeft.DragDelta += HandleLeft; //Clipping interior should be withing the bounds of the adorned element. FrameworkElement element = adornedElement as FrameworkElement; if (element != null) { element.SizeChanged += AdornedElement_SizeChanged; } }