using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using System.Windows.Media; using XHandler.Controls.DrawCanvas; namespace DrawTools { public class PointDrawTool : DrawGeometryBase { #region 字段 private Point? topLeft, bottomRight; private Double radiusX, radiusY; private Point center; public static int ID = 1; #endregion #region 属性 public Int32 TouchId { get; protected set; } public Boolean CanTouchEnter { get; protected set; } public Boolean CanTouchLeave { get; protected set; } public Boolean CanTouchDown { get; protected set; } public Boolean CanTouchMove { get; protected set; } public Boolean CanTouchUp { get; protected set; } public Boolean CanKeyDown { get; protected set; } public Boolean CanKeyUp { get; protected set; } public Boolean IsFinish { get; protected set; } public DrawToolType DrawingToolType { get; protected set; } public Boolean CanEdit { get; protected set; } public Int32 Mode { get; protected set; } #endregion #region 鼠标键盘事件 public override Boolean OnKeyDown(Key key) { if (key != Key.LeftShift || !bottomRight.HasValue) return false; return OnTouchMove(bottomRight.Value); } public override Boolean OnKeyUp(Key key) { if (key != Key.LeftShift || !bottomRight.HasValue) return false; return OnTouchMove(bottomRight.Value); } public override Boolean OnTouchLeave(Point point) { EllipseGeometry ellipseGeometry = new EllipseGeometry(); ellipseGeometry.RadiusX = 20; ellipseGeometry.RadiusY = 20; ellipseGeometry.Center = new Point(point.X, point.Y); //geometry = ellipseGeometry; FormattedText text = new FormattedText(ID.ToString(), CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Tahoma"), 20, Brushes.Black); Geometry textGeometry = text.BuildGeometry(new Point(point.X+30, point.Y)); PathGeometry pg = PathGeometry.CreateFromGeometry(textGeometry); ID++; GeometryGroup geometryGroup = new GeometryGroup(); geometryGroup.Children.Add(ellipseGeometry); geometryGroup.Children.Add(textGeometry); //CombinedGeometry combinedGeometry = new CombinedGeometry(); //combinedGeometry.GeometryCombineMode = GeometryCombineMode.Union; //combinedGeometry.Geometry1 = ellipseGeometry; //combinedGeometry.Geometry2 = textGeometry; //geometry = pg; //if (!bottomRight.HasValue) // this.drawingCanvas.DeleteVisual(this); //else //{ // var figure = pathGeometry.Figures[0]; // figure.StartPoint = new Point(topLeft.Value.X, center.Y); // var clockwise = bottomRight.Value.X > topLeft.Value.X ? SweepDirection.Clockwise : SweepDirection.Counterclockwise; // var arc = new ArcSegment(new Point(bottomRight.Value.X, center.Y), new Size(radiusX, radiusY), 0, false, clockwise, true); // figure.Segments.Add(arc); // arc = new ArcSegment(figure.StartPoint, new Size(radiusX, radiusY), 0, false, clockwise, true); // figure.Segments.Add(arc); //geometry = geometry.GetWidenedPathGeometry(pen); geometry = geometryGroup.GetFlattenedPathGeometry(); Draw(); //} //this.drawingCanvas.DeleteWorkingDrawTool(this); this.DrawingCanvas.AddVisual(this); this.IsFinish = true; this.CanTouchDown = false; this.CanTouchMove = false; this.CanTouchLeave = false; this.CanKeyDown = false; this.CanKeyUp = false; if (this.TouchId == 0 && this.DrawingCanvas.IsMouseCaptured) this.DrawingCanvas.ReleaseMouseCapture(); return true; } public override Boolean OnTouchDown(Int32 touchId, Point point) { this.TouchId = touchId; this.pen = this.DrawingCanvas.Pen; //if (!topLeft.HasValue) //{ // this.drawingCanvas.AddWorkingDrawTool(this); // this.pen = this.drawingCanvas.Pen; // topLeft = point; // this.geometry = new PathGeometry(); // var figure = new PathFigure { IsClosed = true }; // pathGeometry.Figures.Add(figure); // this.CanTouchMove = true; // this.CanKeyDown = true; // this.CanKeyUp = true; // if (this.TouchId != 0 || !this.drawingCanvas.CaptureMouse()) // this.CanTouchLeave = true; // this.drawingCanvas.AddVisual(this); //} //else return OnTouchLeave(point); return true; } public override Boolean OnTouchMove(Point point) { var dc = this.RenderOpen(); var startPoint = topLeft.Value; if (Keyboard.IsKeyDown(Key.LeftShift)) { var len = Math.Min(Math.Abs(point.X - startPoint.X), Math.Abs(point.Y - startPoint.Y)); point = new Point(startPoint.X + (point.X > startPoint.X ? len : -len), startPoint.Y + (point.Y > startPoint.Y ? len : -len)); } if ((startPoint - point).Length <= pen.Thickness) { dc.Close(); return true; } bottomRight = point; radiusX = (point.X - startPoint.X) / 2; radiusY = (point.Y - startPoint.Y) / 2; center.X = startPoint.X + radiusX; center.Y = startPoint.Y + radiusY; radiusX = Math.Abs(radiusX); radiusY = Math.Abs(radiusY); dc.DrawEllipse(null, pen, center, radiusX, radiusY); dc.Close(); return true; } #endregion public PointDrawTool(DrawingCanvas drawingCanvas) : base(drawingCanvas) { this.DrawingToolType = DrawToolType.Ellipse; // 准备要处理的事件 this.CanTouchDown = true; } #region 序列化 public override DrawGeometrySerializerBase ToSerializer() { var serializer = new DrawEllipseSerializer { Color = ((SolidColorBrush)pen.Brush).Color, StrokeThickness = pen.Thickness, Geometry = geometry.ToString() }; if (geometry.Transform != null) serializer.Matrix = geometry.Transform.Value; return serializer; } public override void DeserializeFrom(DrawGeometrySerializerBase serializer) { this.pen = new Pen(new SolidColorBrush(serializer.Color), serializer.StrokeThickness); this.geometry = Geometry.Parse(serializer.Geometry).GetFlattenedPathGeometry(); this.geometry.Transform = new TranslateTransform(serializer.Matrix.OffsetX, serializer.Matrix.OffsetY); this.IsFinish = true; this.Draw(); } #endregion /* public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private VisualCollection _children; private string filename; private int _ID = 0; private bool _IsSelected; public bool IsSelected { get { return _IsSelected; } set { _IsSelected = value; OnPropertyChanged("IsSelected"); } } private Point _PositionOnCanvas; public Point PositionOnCanvas { get { return _PositionOnCanvas; } set { _PositionOnCanvas = value; OnPropertyChanged("PositionOnCanvas"); } } public PointDrawTool() { _children = new VisualCollection(this); _children.Add(CreateDrawingVisualCircle()); _children.Add(CreateInvisibleDrawingVisualCircle()); _children.Add(CreateDrawingVisualText()); } public PointDrawTool(string text) { _children = new VisualCollection(this); _children.Add(CreateDrawingVisualCircle()); _children.Add(CreateInvisibleDrawingVisualCircle()); _children.Add(CreateDrawingVisualText()); filename = text; } public PointDrawTool(string text, Point pt) { filename = "S" + _ID; _ID += 1; PositionOnCanvas = pt; _children = new VisualCollection(this); _children.Add(CreateDrawingVisualCircle()); _children.Add(CreateInvisibleDrawingVisualCircle()); _children.Add(CreateDrawingVisualText()); } protected override int VisualChildrenCount { get { return _children.Count; } } protected override Visual GetVisualChild(int index) { if ((index < 0) || (index >= _children.Count)) throw new ArgumentOutOfRangeException(); return _children[index]; } public override string ToString() { return this.ToString(); } private DrawingVisual CreateDrawingVisualCircle() { DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen(); drawingContext.DrawEllipse(Brushes.Red, new Pen(Brushes.Red, 1.0), PositionOnCanvas, 4, 4); drawingContext.Close(); return drawingVisual; } private DrawingVisual CreateInvisibleDrawingVisualCircle() { DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen(); drawingContext.DrawEllipse(Brushes.Transparent, new Pen(Brushes.Yellow, 1.0), PositionOnCanvas, 20, 20); drawingContext.Close(); return drawingVisual; } private DrawingVisual CreateDrawingVisualText() { DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen(); drawingContext.DrawText(new FormattedText(filename, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Verdana"), 10, Brushes.Black), new Point(PositionOnCanvas.X + 5, PositionOnCanvas.Y - 15)); drawingContext.Close(); return drawingVisual; } public void ReDraw() { _children.Clear(); _children = new VisualCollection(this); _children.Add(CreateDrawingVisualCircle()); _children.Add(CreateInvisibleDrawingVisualCircle()); _children.Add(CreateDrawingVisualText()); //Me.ToolTip = CreateToolTip() } */ } }