前言
WPF中绘图有两种方式Canvas
和InkCanvas
Canvas
需要完全由自己实现。InkCanvas
已经默认为我们实现了基本的绘制,同时效果也比较好。
InkCanvas
推荐使用InkCanvas,使用它绘制线的时候会自动优化转折的地方,会变得平滑。
InkCanvas本身已经支持使用鼠标或者触屏来画线,下面的示例是使用代码进行画线。
画线
如下在BlackboardCanvas中绘制一条直线
1 | private void DrawTest() |
我们也可以在Stroke中添加新的点
1 | stroke.StylusPoints.Add(new StylusPoint(300, 200)); |
鼠标事件绘制
在实际绘制中我们可以在鼠标按下时添加对象
1 | Stroke stroke = new Stroke(new StylusPointCollection(new[] { new Point(100, 100) })); |
鼠标移动时添加点
1 | BlackboardCanvas.Strokes.Last().StylusPoints.Add(new StylusPoint(300, 200)); |
示例代码
1 | public void MouseDown(double x, double y) |
鼠标事件
1 | _mCanvas.MouseMove += Canvas_MouseMove; |
注意
MouseDown
和MouseUp
事件无法正常工作,因为它是由InkCanvas处理的,并且没有被冒泡。
解决方法有两种
- 我们可以使用
PreviewMouseDown/PreviewMouseLeftButtonDown
和PreviewMouseUp/PreviewMouseLeftButtonUp
来代替,因为他们是隧道事件,并且在冒泡事件之前首先运行。 - 使用
AddHandler
。
推荐
建议使用使用
AddHandler
,因为PreviewMouseUp
实际是在事件执行之前触发,本来我们要在这个事件中要保存已绘制的笔迹,但是实际上会少了最后的一笔,因为最后一笔的绘制还没执行。
方式1
1 | _mCanvas.PreviewMouseLeftButtonDown += Canvas_MouseDown; |
方式2
使用AddHandler
.aspx):
1 | _mCanvas.MouseMove += Canvas_MouseMove; |
工具类
1 | using System.Collections.Generic; |
Canvas
工具类
1 | using System; |