相关知识参考DrawTool画笔之纹理笔 , 图形笔的实现跟纹理笔的实现是一样的,重载Stroke的DrawCore方法,效果图:
------------------------------------------------------------
代码如下:
/// <summary> /// 图形笔 /// </summary> public class ImageStroke : Stroke { PRivate string imageFile_; private System.Windows.Media.ImageSource imageSource_; private Point curPoint; public ImageStroke(System.Windows.Input.StylusPointCollection points, DrawingAttributes da, string file) : base(points, da) { this.imageFile_ = file; this.imageSource_ = new System.Windows.Media.Imaging.BitmapImage(new Uri( this.imageFile_)); } protected override void DrawCore(System.Windows.Media.DrawingContext drawingContext, DrawingAttributes drawingAttributes) { double num = drawingAttributes.Width + 20.0; System.Windows.Media.StreamGeometry streamGeometry = new System.Windows.Media.StreamGeometry(); using (System.Windows.Media.StreamGeometryContext streamGeometryContext = streamGeometry.Open()) { streamGeometryContext.BeginFigure((Point)base.StylusPoints[0], false, false); drawingContext.DrawImage(this.imageSource_, new Rect(((Point)base.StylusPoints[0]).X - num / 2.0, ((Point)base.StylusPoints[0]).Y - num / 2.0, num, num)); this.curPoint = (Point)base.StylusPoints[0]; foreach (System.Windows.Input.StylusPoint current in base.StylusPoints) { ImageStroke.DrawImage(ref this.curPoint, (Point)current, num, drawingContext, this.imageSource_); } } } public static double GetDistance(Point a, Point b) { return System.Math.Abs(Point.Subtract(a, b).Length); } public static Point GetPointBetween(Point a, Point b, double len) { Vector vector = Point.Subtract(a, b); vector.Normalize(); vector = Vector.Multiply(vector, len); return Point.Subtract(a, vector); } public static void DrawImage(ref Point a, Point b, double width, System.Windows.Media.DrawingContext drawingContext, System.Windows.Media.ImageSource imageSource) { for (double distance = ImageStroke.GetDistance(a, b); distance >= width; distance = ImageStroke.GetDistance(a, b)) { Point pointBetween = ImageStroke.GetPointBetween(a, b, width); drawingContext.DrawImage(imageSource, new Rect(pointBetween.X - width / 2.0, pointBetween.Y - width / 2.0, width, width)); a = pointBetween; } } }
实例应用可以参考纹理笔,在生成stroke对象时候使用ImageStroke然后将stroke添加到inkcanvas的strokes集合中
新闻热点
疑难解答