【问题标题】:WPF Line, path ..etc custom drawing styleWPF Line, path ..etc 自定义绘图样式
【发布时间】:2009-10-29 06:32:58
【问题描述】:

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

谢谢

【问题讨论】:

  • 我现在没有足够的时间为你研究一个正确的答案,但是看看这篇文章:msdn.microsoft.com/en-us/magazine/cc337899.aspx,它可能对你很有用,并且有一个实现我相信包括平行线路径。
  • 您好,谢谢您的评论,但我已经完成了上面的复制现有路径,而不是使用不同画笔的单个路径
  • 可以使用blogs.msdn.com/b/mrochon/archive/2011/01/10/…,然后绘制一条较长的线,作为长度为 1 的较小连续线或您想要的自定义边帽

标签: wpf drawing graphics2d


【解决方案1】:

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 系统来拉伸图像)。这是通过递归遍历DrawingGroup 对象、随时跟踪变换以及使用适当的变换构造 GeometryDrawings 来完成的。
  2. 删除原始图形“端盖”区域中的几何部分并将它们放在一边。
  3. 沿路径迭代,重复复制GeometryDrawing 对象,并对几何体中的所有坐标应用适当的坐标变换。
  4. 使用相同的程序处理几何体的“端盖”部分。

还要注意在第 1 步中,任何GlyphRunDrawings 都使用FormattedText.BuildGeometry 处理以创建等效的GeometryDrawing

【讨论】:

  • thx .. 我需要像 adobe 笔触这样的东西,您可以在其中虚拟地沿路径应用图案……目前正在以低水平进行,效果还不错。
  • 我在回答中添加了更多信息,描述了我如何在 WPF 中实现任意自定义笔画,就像 Adob​​e 中的笔画一样。我希望它有所帮助。
【解决方案2】:

在 WPF 中不支持执行此操作的方法。解决方案将涉及复合 Path 对象或花哨的代码隐藏体操。您是否专门寻找三线路径实现?

【讨论】:

  • 使用附加属性来强制几何体使得这相对容易。详情见我的回答。
  • 哇,这太酷了。我从来没有想过这样做:)。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多