Blame view
sources/RoboforkApp/Adorners/RubberbandAdorner.cs
3.73 KB
729be9a6d
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; namespace RoboforkApp { public class RubberbandAdorner : Adorner { private Point? startPoint, endPoint; private Rectangle rubberband; private DesignerCanvas designerCanvas; private VisualCollection visuals; private Canvas adornerCanvas; protected override int VisualChildrenCount { get { return this.visuals.Count; } } public RubberbandAdorner(DesignerCanvas designerCanvas, Point? dragStartPoint) : base(designerCanvas) { this.designerCanvas = designerCanvas; this.startPoint = dragStartPoint; this.adornerCanvas = new Canvas(); this.adornerCanvas.Background = Brushes.Transparent; this.visuals = new VisualCollection(this); this.visuals.Add(this.adornerCanvas); this.rubberband = new Rectangle(); this.rubberband.Stroke = Brushes.Navy; this.rubberband.StrokeThickness = 1; this.rubberband.StrokeDashArray = new DoubleCollection(new double[] { 2 }); this.adornerCanvas.Children.Add(this.rubberband); } protected override void OnMouseMove(MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { if (!this.IsMouseCaptured) { this.CaptureMouse(); } this.endPoint = e.GetPosition(this); this.UpdateRubberband(); this.UpdateSelection(); e.Handled = true; } } protected override void OnMouseUp(MouseButtonEventArgs e) { if (this.IsMouseCaptured) { this.ReleaseMouseCapture(); } AdornerLayer adornerLayer = this.Parent as AdornerLayer; if (adornerLayer != null) { adornerLayer.Remove(this); } } protected override Size ArrangeOverride(Size arrangeBounds) { this.adornerCanvas.Arrange(new Rect(arrangeBounds)); return arrangeBounds; } protected override Visual GetVisualChild(int index) { return this.visuals[index]; } private void UpdateRubberband() { double left = Math.Min(this.startPoint.Value.X, this.endPoint.Value.X); double top = Math.Min(this.startPoint.Value.Y, this.endPoint.Value.Y); double width = Math.Abs(this.startPoint.Value.X - this.endPoint.Value.X); double height = Math.Abs(this.startPoint.Value.Y - this.endPoint.Value.Y); this.rubberband.Width = width; this.rubberband.Height = height; Canvas.SetLeft(this.rubberband, left); Canvas.SetTop(this.rubberband, top); } private void UpdateSelection() { Rect rubberBand = new Rect(this.startPoint.Value, this.endPoint.Value); foreach (DesignerItem item in this.designerCanvas.Children) { Rect itemRect = VisualTreeHelper.GetDescendantBounds(item); Rect itemBounds = item.TransformToAncestor(designerCanvas).TransformBounds(itemRect); if (rubberBand.Contains(itemBounds)) { item.IsSelected = true; } else { item.IsSelected = false; } } } } } |