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()
|
}
|
*/
|
}
|
}
|