WPF 开发 —— 画笔,墨迹渲染(InkCanvas)

  • Post author:
  • Post category:其他


在 WPF 中实现画笔非常简单,基于 InkCanvas 可以实现各种笔形的绘图,以及图形擦除。



备注:很多早期的 WPF 文章基于 InkPresenter 实现,基本上是说 Winphone 平台,在 Win10 中 InkPresenter 相关代码可以编译,但是运行没有效果,应该用 InkCanvas 替代,他们的接口是一样的。

在 InkCanvas 的绘图模型中,笔迹(或者墨迹)通过 Stroke (一笔,一划)组织,一个 Stroke 包含一个个 StylusPointCollection (笔迹集)和一个 DrawingAttributes (笔形)。StylusPointCollection 包含多个 StylusPoint (笔迹)。

InkCanvas 的使用方法如下:(注意不能透明 Opacity=”1″)

<InkCanvas Grid.Row="1" Grid.Column="1" x:Name="inkCanvas" Height="500" Width="600"
      PreviewMouseDown="inkCanvas_MouseLeftButtonDown"
      LostMouseCapture="inkCanvas_LostMouseCapture"
      MouseMove="inkCanvas_MouseMove"
      Opacity="1">
</InkCanvas>

下面的代码片段将捕获的笔迹(鼠标位置)转换为 StylusPoint,并加入到 StylusPointCollection 中。

StylusPointCollection stylusPointCollection = new StylusPointCollection();
Point pt = e.GetPosition(inkCanvas);
stylusPointCollection.Add(new StylusPoint(pt.X, pt.Y));
//stylusPointCollection.Add(e.StylusDevice.GetStylusPoints(inkCanvas));

在电脑上通过鼠标模拟画笔,因为没有画笔硬件设备,所以 StylusDevice (画笔设备)为 NULL,不能通过 GetStylusPoints 获取 StylusPoint (上面注释掉的代码)。

后续内容:

  1. 实现删除笔迹
  2. 捕获触摸板事件
  3. 实现多点触摸
  4. 提高响应性能

参考资料:


  1. 利用WPF InkCanvas水墨控件圈选移动笔画

  2. #481 – 在InkCanvas 上使用鼠标绘图(You Can Draw On an InkCanvas Control with the Mouse)

  3. WPF InkCanvas MouseDown及MouseLeftButtonDown事件不触发的代替事件



版权声明:本文为luansxx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。