public class LineAdorner : Adorner { bool IsStartPoint = false; bool IsControlModeOn = false; bool IsMisPoint = false; Size size = new Size(10, 10); SnapToGrid snap = new SnapToGrid(); public LineAdorner(UIElement adornedElement) : base(adornedElement) { this.MouseLeftButtonDown += new MouseButtonEventHandler(LineAdorner_MouseLeftButtonDown); this.MouseLeftButtonUp += new MouseButtonEventHandler(LineAdorner_MouseLeftButtonUp); this.MouseMove += new MouseEventHandler(LineAdorner_MouseMove); } void LineAdorner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Control) IsControlModeOn = true; System.Windows.Shapes.Line line = this.AdornedElement as System.Windows.Shapes.Line; LineItem lineItem = line.DataContext as LineItem; Point p = snap.Snap(e.GetPosition(line), SnapToGrid.SnapMode.Move); double dStart = 0.0; double dEnd = 0.0; double dmid = 0.0; if (!this.IsMouseCaptured) { dStart = Math.Sqrt(Math.Pow(line.X1 - p.X, 2) + Math.Pow(line.Y1 - p.Y, 2)); dEnd = Math.Sqrt(Math.Pow(line.X2 - p.X, 2) + Math.Pow(line.Y2 - p.Y, 2)); dmid = Math.Sqrt(Math.Pow((((line.X2 + line.X1) / 2) - p.X), 2) + Math.Pow((((line.Y2 + line.Y1) / 2) - p.Y), 2)); } if (IsControlModeOn) { if (this.IsMouseCaptured) { if (IsStartPoint) { line.X1 = p.X; line.Y1 = p.Y; } else { line.X2 = p.X; line.Y2 = p.Y; } this.InvalidateVisual(); this.ReleaseMouseCapture(); IsControlModeOn = false; } else { if (dStart < dEnd) IsStartPoint = true; else IsStartPoint = false; this.InvalidateVisual(); this.CaptureMouse(); } } else { if (!this.IsMouseCaptured) { if (dStart < dEnd) IsStartPoint = true; else IsStartPoint = false; this.InvalidateVisual(); this.CaptureMouse(); } } } void LineAdorner_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (!IsControlModeOn) { if (this.IsMouseCaptured) { System.Windows.Shapes.Line line = this.AdornedElement as System.Windows.Shapes.Line; LineItem lineItem = line.DataContext as LineItem; Point p = snap.Snap(e.GetPosition(line), SnapToGrid.SnapMode.Move); if (IsStartPoint) { line.X1 = p.X; line.Y1 = p.Y; } else { line.X2 = p.X; line.Y2 = p.Y; } this.InvalidateVisual(); this.ReleaseMouseCapture(); } } } void LineAdorner_MouseMove(object sender, MouseEventArgs e) { if (this.IsMouseCaptured) { if (this.AdornedElement.GetType() == typeof(System.Windows.Shapes.Line)) { System.Windows.Shapes.Line line = this.AdornedElement as System.Windows.Shapes.Line; LineItem lineItem = line.DataContext as LineItem; Point p = snap.Snap(e.GetPosition(line), SnapToGrid.SnapMode.Move); // mode: move start or end point if (IsStartPoint) { line.X1 = p.X; line.Y1 = p.Y; } else { line.X2 = p.X; line.Y2 = p.Y; } // mode: move line //if (IsStartPoint) //{ // double dX = line.X1 - p.X; // double dY = line.Y1 - p.Y; // Point pEnd = new Point(line.X2 - dX, line.Y2 - dY); // line.X1 = p.X; // line.Y1 = p.Y; // line.X2 = pEnd.X; // line.Y2 = pEnd.Y; //} //else //{ // double dX = line.X2 - p.X; // double dY = line.Y2 - p.Y; // Point pStart = new Point(line.X1 - dX, line.Y1 - dY); // line.X1 = pStart.X; // line.Y1 = pStart.Y; // line.X2 = p.X; // line.Y2 = p.Y; //} this.InvalidateVisual(); } } }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)