void LineAdorner_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (!IsControlModeOn) { if (this.IsMouseCaptured) { CustomLineElement line = this.AdornedElement as CustomLineElement; LineLogicItem lineItem = line.DataContext as LineLogicItem; Point p = SnapGrid.Snap(e.GetPosition(line), gridSize, GridOffsetLeft, GridOffsetTop); if (IsStartPoint) { lineItem.X1 = p.X; lineItem.Y1 = p.Y; } else { lineItem.X2 = p.X; lineItem.Y2 = p.Y; } // update line item modification flag //if (originalLineItem.CheckForModification(lineItem)) // lineItem.IsModified = true; this.InvalidateVisual(); this.ReleaseMouseCapture(); this.Cursor = Cursors.Arrow; } } }
void LineAdorner_MouseMove(object sender, MouseEventArgs e) { if (this.IsMouseCaptured) { if (this.AdornedElement.GetType() == typeof(CustomLineElement)) { CustomLineElement line = this.AdornedElement as CustomLineElement; LineLogicItem lineItem = line.DataContext as LineLogicItem; Point p = SnapGrid.Snap(e.GetPosition(line), gridSize, GridOffsetLeft, GridOffsetTop); // edit mode: move line start point OR move line end point if (mode == LineAdornerMode.Edit) { if (IsStartPoint) { lineItem.X1 = p.X; lineItem.Y1 = p.Y; } else { lineItem.X2 = p.X; lineItem.Y2 = p.Y; } } // move mode: move line start point AND move line end point if (mode == LineAdornerMode.Move) { if (IsStartPoint) { double dX = lineItem.X1 - p.X; double dY = lineItem.Y1 - p.Y; Point pEnd = new Point(lineItem.X2 - dX, lineItem.Y2 - dY); lineItem.X1 = p.X; lineItem.Y1 = p.Y; lineItem.X2 = pEnd.X; lineItem.Y2 = pEnd.Y; } else { double dX = lineItem.X2 - p.X; double dY = lineItem.Y2 - p.Y; Point pStart = new Point(lineItem.X1 - dX, lineItem.Y1 - dY); lineItem.X2 = p.X; lineItem.Y2 = p.Y; lineItem.X1 = pStart.X; lineItem.Y1 = pStart.Y; } } this.InvalidateVisual(); } } }
//static Pen penGuide = new Pen(new SolidColorBrush(Color.FromArgb(128, 255, 127, 0)), 1.0); protected override void OnRender(DrawingContext drawingContext) { if (this.AdornedElement.GetType() == typeof(CustomLineElement)) { CustomLineElement line = this.AdornedElement as CustomLineElement; LineLogicItem lineItem = line.DataContext as LineLogicItem; Canvas c = FindVisualParent <Canvas>(line); double w = c.Width; double h = c.Height; // draw guide lines if (this.IsMouseCaptured) { /* * double halfPenWidthGuide = penGuide.Thickness / 2; * * // horizontal guide * Point h0 = new Point(0, IsStartPoint ? lineItem.Y1 : lineItem.Y2); * Point h1 = new Point(w, IsStartPoint ? lineItem.Y1 : lineItem.Y2); * * // vertical guide * Point v0 = new Point(IsStartPoint ? lineItem.X1 : lineItem.X2, 0); * Point v1 = new Point(IsStartPoint ? lineItem.X1 : lineItem.X2, h); * * // draw lines * GuidelineSet gg1 = new GuidelineSet(); * gg1.GuidelinesX.Add(h0.X + halfPenWidthGuide); * gg1.GuidelinesX.Add(h1.X + halfPenWidthGuide); * gg1.GuidelinesY.Add(h0.Y + halfPenWidthGuide); * gg1.GuidelinesY.Add(h1.Y + halfPenWidthGuide); * drawingContext.PushGuidelineSet(gg1); * * drawingContext.DrawLine(penGuide, h0, h1); * drawingContext.Pop(); * * GuidelineSet gg2 = new GuidelineSet(); * gg2.GuidelinesX.Add(v0.X + halfPenWidthGuide); * gg2.GuidelinesX.Add(v1.X + halfPenWidthGuide); * gg2.GuidelinesY.Add(v0.Y + halfPenWidthGuide); * gg2.GuidelinesY.Add(v1.Y + halfPenWidthGuide); * drawingContext.PushGuidelineSet(gg2); * * drawingContext.DrawLine(penGuide, v0, v1); * drawingContext.Pop(); */ } double halfPenWidth = pen.Thickness / 2; //Point p1 = new Point(lineItem.X1, lineItem.Y1); //Point p2 = new Point(lineItem.X2, lineItem.Y2); Point p1 = new Point(line.X1, line.Y1); Point p2 = new Point(line.X2, line.Y2); p1.Offset(-size.Width / 2, -size.Height / 2); p2.Offset(-size.Width / 2, -size.Height / 2); Rect r1 = new Rect(p1, size); Rect r2 = new Rect(p2, size); GuidelineSet g1 = new GuidelineSet(); g1.GuidelinesX.Add(r1.Left + halfPenWidth); g1.GuidelinesX.Add(r1.Right + halfPenWidth); g1.GuidelinesY.Add(r1.Top + halfPenWidth); g1.GuidelinesY.Add(r1.Bottom + halfPenWidth); drawingContext.PushGuidelineSet(g1); drawingContext.DrawRectangle(brush, pen, r1); drawingContext.Pop(); GuidelineSet g2 = new GuidelineSet(); g2.GuidelinesX.Add(r2.Left + halfPenWidth); g2.GuidelinesX.Add(r2.Right + halfPenWidth); g2.GuidelinesY.Add(r2.Top + halfPenWidth); g2.GuidelinesY.Add(r2.Bottom + halfPenWidth); drawingContext.PushGuidelineSet(g2); drawingContext.DrawRectangle(brush, pen, r2); drawingContext.Pop(); } base.OnRender(drawingContext); }
void LineAdorner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Control) { IsControlModeOn = true; } CustomLineElement line = this.AdornedElement as CustomLineElement; LineLogicItem lineItem = line.DataContext as LineLogicItem; Point p = SnapGrid.Snap(e.GetPosition(line), GridSize, GridOffsetLeft, GridOffsetTop); double dStart = 0.0; double dEnd = 0.0; if (!this.IsMouseCaptured) { // copy original coordinates originalLineItem = new LineLogicItem() { X1 = lineItem.X1, Y1 = lineItem.Y1, X2 = lineItem.X2, Y2 = lineItem.Y2 }; // calculate start/end point coordinates dStart = Math.Sqrt(Math.Pow(lineItem.X1 - p.X, 2) + Math.Pow(lineItem.Y1 - p.Y, 2)); dEnd = Math.Sqrt(Math.Pow(lineItem.X2 - p.X, 2) + Math.Pow(lineItem.Y2 - p.Y, 2)); } if (IsControlModeOn) { if (this.IsMouseCaptured) { if (IsStartPoint) { lineItem.X1 = p.X; lineItem.Y1 = p.Y; } else { lineItem.X2 = p.X; lineItem.Y2 = p.Y; } this.InvalidateVisual(); this.ReleaseMouseCapture(); IsControlModeOn = false; } else { IsStartPoint = dStart < dEnd ? true : false; this.Cursor = Cursors.Hand; this.InvalidateVisual(); this.CaptureMouse(); } } else { if (!this.IsMouseCaptured) { IsStartPoint = dStart < dEnd ? true : false; this.Cursor = Cursors.Hand; this.InvalidateVisual(); this.CaptureMouse(); } } }
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { if (this.DataContext is PageItem) { //if (Keyboard.Modifiers == ModifierKeys.Control) // IsControlModeOn = true; /* * PageItem Page = this.DataContext as PageItem; * Point p = GetClickLocation(e.GetPosition(this), GridOffsetLeft, GridOffsetTop); * Page.Items.Add(new AndGateLogicItem() * { * IsNew = true, * IsModified = false, * IsDeleted = false, * X = p.X, * Y = p.Y, * Z = 1 * }); */ PageItem Page = this.DataContext as PageItem; Page.SelectedItem = null; Point p = SnapGrid.Snap(e.GetPosition(this), GridSize, GridOffsetLeft, GridOffsetTop); if (this.IsMouseCaptured) { //currentLineItem.X2 = p.X; //currentLineItem.Y2 = p.Y; //c.ReleaseMouseCapture(); } else { Point pHit = e.GetPosition(this); CustomLineElement lineHit = null; HitTestResult result = VisualTreeHelper.HitTest(this, pHit); if (result != null) { if (result.VisualHit.GetType() == typeof(CustomLineElement)) { lineHit = result.VisualHit as CustomLineElement; } } if (lineHit == null && selectedLine == null) { currentLineItem = new LineLogicItem() { IsNew = false, IsModified = false, IsDeleted = false, X1 = p.X, Y1 = p.Y, X2 = p.X, Y2 = p.Y, Z = 0 }; Page.Items.Add(currentLineItem); this.CaptureMouse(); } if (lineHit != selectedLine && selectedLine != null) { if (Keyboard.Modifiers != ModifierKeys.Control) { var LineAdornerLayer = AdornerLayer.GetAdornerLayer(selectedLine); if (LineAdornerLayer != null) { LineAdornerLayer.Remove(LineAdornerLayer.GetAdorners(selectedLine)[0]); } selectedLine = null; } } if (lineHit != null && lineHit != selectedLine) { selectedLine = lineHit; var LineAdornerLayer = AdornerLayer.GetAdornerLayer(lineHit); if (LineAdornerLayer != null) { LineAdornerLayer.Add(new LineAdorner(lineHit)); } } //currentLineItem = new LineLogicItem() { X1 = p.X, Y1 = p.Y, X2 = p.X, Y2 = p.Y, Z = 0 }; //Page.Items.Add(currentLineItem); //c.CaptureMouse(); } } }