WPF 线条、路径..等自定义绘图样式

标签 wpf drawing graphics2d

在 WPF 中,有没有一种方法可以修改从 Dash-Dot 序列绘制任何路径的方式?假设我想为我正在绘制的任何路径或绘图路径本身上的小三角形、波浪等绘制一条三重线。我已经尝试过画笔,但它不会遵循路径。请帮忙

谢谢

最佳答案

WPF 的 Geometry 类具有轻松完成此操作所需的所有基元,但您需要在代码中完成此操作。当我需要进行自定义线条时,我通常会根据 Geometry 构建一个 Drawing,但在您的情况下,您可以简单地构建一个具有以下内容的 Geometry:三条平行线并描边。

  1. PathGeometry.CreateFromGeometry() 开始获取输入路径的 PathGeometry
  2. 使用GetWidenedPathGeometry(),传入所需的间距,获取一个新的几何图形,其边缘对应于边线
  3. (可选)根据需要删除加宽几何体末端的线段
  4. 使用CombinedGeometry将边线几何图形与原始几何图形组合
  5. 抚摸组合的几何体以获得三重线

有关步骤 3 的更多说明:加宽的几何图形在原始线的末端有线段。这会导致在线条末端画一条线,这在许多情况下实际上看起来很美观。如果没有它您的情况看起来会更好,请通过迭代边线几何图形并删除穿过原始路径端点的所有线段来删除它。

如果不删除末端,上面大约需要 8 行代码,如果删除则需要 15 行代码。

使此方便的一个技巧是创建一个附加属性,该属性可以有效地强制其附加到的 Path 控件的 Data 属性。有了这样一个附加属性,您只需编写:

<Path TripleStroke.Enable="true" Data="..." />

如果您知道如何实现附加属性并在其中注册处理程序,那么这就是小菜一碟。如果没有,请计划在实现附加属性方法之前花几个小时学习如何编写附加属性代码以模拟值强制。

更新

我上面描述的基本技术也可以扩展以允许沿路径应用任意模式。有关示例,请参阅表达式设计工具中的自定义画笔。然而,WPF 中没有内置任何内容可以为您执行此操作,因此您需要自己创建它,并且我可以根据经验告诉您,这是一项艰巨的工作。以下是基本步骤:

首先创建一个方法,该方法采用Geometry、现有Drawing以及端盖等的一些参数,并创建一个新的Drawing沿着Geometry给定的路径重复给定的Drawing。然后绘制描边路径就很容易了:创建一个 Drawing 来描述自定义描边,然后使用包含 BindingDrawingVisual 显示描边> 使用调用您的转换方法的转换器。

实际实现转换方法:

  1. 将源绘图转换为一组 GeometryDrawing 对象(我还支持 ImageDrawing 但这更复杂,因为您需要使用 3D 系统来拉伸(stretch)图像) 。这是通过递归 DrawingGroup 对象、跟踪变换并使用适当的变换构造 GeometryDrawings 来完成的。
  2. 删除原始绘图“端盖”区域中的部分几何图形并将其放在一边。
  3. 沿着路径迭代,重复复制 GeometryDrawing 对象,并将适当的坐标变换应用于几何中的所有坐标。
  4. 使用相同的过程处理几何形状的“端盖”部分。

另请注意,在步骤 1 中,任何 GlyphRunDrawings 均使用 FormattedText.BuildGeometry 进行处理,以创建等效的 GeometryDrawing

关于WPF 线条、路径..等自定义绘图样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641941/

相关文章:

部分透明图像上的 WPF 光标

c# - 相同的 ItemSource,但每个列表框都有另一个 View

c# - 将旋转多边形内的内容传输到位图

javascript - 钛合金静态和动态绘图/绘画

wpf - DataGrid RowStyle - DataTrigger 中的绑定(bind)值

c# - 如何动态更新 Assemblyinfo.cs 中的值

ios - 如何使用这个复杂的参数方程在 iOS 中绘制曲线

java - 将 Graphics2d 调整为 JScrollPane

java - 在 JLabel 上画线

java - 在黑/白背景上旋转的 2D 图形