WPF 基于Geometry的橡皮擦功能

  • Post category:C#

这是我大约半年前就想写的随笔。

功能很简单。

就是基于Geometry的画布,记录鼠标轨迹生成PathGeometry。再就是添加删除Path的功能也就是path笔迹删除。

目前是实现了两种方式。

1 基于预览擦除

2 实时擦除

 

 

 

两者在具体技术上没有任何的区别都是依靠Geometry.Combine的A-B图形运算       

也就是A图形中减去B图形并返回一个新的Geometry类型的图形。

同时也都会用上一个GetWidenedPathGeometry的Geometry方法。

这个方法会根据原有的path轨迹并使用一个Pen的笔宽去描绘一个同轨迹的形状。

不过需要注意的是,获取GetWidenedPathGeometry之后绘制这个geometry时不能再使用pen了,如果有必要时则必须要保证新的pen的笔宽小于生成时的笔宽。不然会产生绘制出来的图形全使毛刺的问题

 

 

 

当然这个也是绘制的角有关。

如果使用了一下代码的Pen则会产生另外一种现象。

 private Pen _normalPen = new Pen(new SolidColorBrush(Colors.Black), 10)
        {
            StartLineCap = PenLineCap.Round,
            EndLineCap = PenLineCap.Round,
            LineJoin = PenLineJoin.Round,
            MiterLimit = 1
        };

 

 

还会有另外一种现象,是毛刺朝内,一直时间想不起来怎么弄了…(待我想起来补图…)

基本原因都是GetWidenedPathGeometry没有处理好的原因。

没怎么放代码,因为如果能需要这个功能,你肯定是缺少思路。很多事情就是差灵光一闪了。

demo中包含画布,画笔,橡皮擦1,橡皮擦2 总共不到400行。

总的来说没啥称之为技术的东西,很多是经验,我下面提供了源代码,可以自己看看。

 

说明:实时擦除部分是直接参考使用wpf技术实现画图工具 – 孤独成派 – 博客园 (cnblogs.com)这位大佬的。

 

源代码下载