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

WPF线条、路径等自定义图形样式,wpf,drawing,graphics2d,Wpf,Drawing,Graphics2d,在WPF中,是否有一种方法可以修改任何路径与点划线序列分开的方式?假设我要为我正在绘制的任何路径或绘制路径本身上的小三角形、波浪等绘制一条三线。我已尝试使用笔刷,但它不会遵循路径。请帮忙 thx在WPF中不支持执行此操作的方法。解决方案将涉及组合路径对象或体操背后的奇特代码。您是否在具体寻找三线路径实现?WPF的几何体类具有轻松实现这一点所需的所有原语,但您需要在代码中完成。当我需要做自定义线条时,我通常会基于几何体构建一个图形,但在您的情况下,您可以简单地构建一个具有三条平行线条的几何体,并对

在WPF中,是否有一种方法可以修改任何路径与点划线序列分开的方式?假设我要为我正在绘制的任何路径或绘制路径本身上的小三角形、波浪等绘制一条三线。我已尝试使用笔刷,但它不会遵循
路径
。请帮忙


thx

在WPF中不支持执行此操作的方法。解决方案将涉及组合路径对象或体操背后的奇特代码。您是否在具体寻找三线路径实现?

WPF的
几何体
类具有轻松实现这一点所需的所有原语,但您需要在代码中完成。当我需要做自定义线条时,我通常会基于
几何体
构建一个
图形
,但在您的情况下,您可以简单地构建一个具有三条平行线条的
几何体
,并对其进行笔划

  • PathGeometry.CreateFromGeometry()
    开始获取输入路径的
    PathGeometry
  • 使用
    getWideedPathGeometry()
    ,传入所需的间距,以获取其边与边线对应的新几何体
  • (可选)如果需要,删除加宽几何图形末端的线段
  • 使用
    CombinedGeometry
  • 对组合几何体进行笔划以获得三重线
  • 关于步骤3的更多说明:加宽的几何图形在原始直线的末端有线段。这会导致在线条的末端画一条线,在许多情况下,这实际上看起来很美观。如果没有它,情况会更好,请通过迭代边线几何图形并删除通过原始路径端点的所有线段来删除它

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

    一个方便的技巧是创建一个附加属性,该属性有效地强制它所附加到的
    路径
    控件的
    数据
    属性。有了这样一个附加属性,您只需编写:

    <Path TripleStroke.Enable="true" Data="..." />
    
    
    
    如果您知道如何实现附加属性并在其中注册处理程序,这是小菜一碟。如果没有,在实现附加属性方法之前,计划花几个小时学习如何编写附加属性以模拟值强制

    更新

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

    首先创建一个方法,该方法采用一个
    几何图形
    一个现有的
    图形
    ,以及一些端盖参数等,并创建一个新的
    图形
    ,该图形沿着
    几何图形
    给出的路径重复给定的
    图形
    。然后很容易绘制笔划路径:创建一个
    图形
    来描述自定义笔划,然后使用
    DrawingVisual
    显示笔划,该图形包含一个
    绑定
    ,并带有一个调用转换方法的转换器

    要实际实现转换方法,请执行以下操作:

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

  • 还要注意,在步骤1中,任何
    GlyphrunDrawing
    都是使用
    FormattedText.BuildGeometry
    来处理的。要创建等效的
    GeometryDrawing

    我现在没有足够的时间为您研究一个正确的答案,但看看这篇文章:,它可能对您非常有用,我相信其中包含了一个平行线路径的实现。您好,谢谢您的评论,但我已经阅读了上面的内容,它复制了现有的路径,使用不同笔刷的单个路径都不能使用,然后将较长的线绘制为长度为1的较小连续线,或者使用自定义边贴图绘制较长的线。使用附加属性强制几何体相对容易。详细信息请参见我的答案。哇,这太酷了。我从来没有想过这样做:)。谢谢。。我需要像adobe brush stroke这样的东西,在那里你可以沿路径虚拟地应用图案。。。我现在做的是低水平的,结果还可以。我在回答中添加了更多信息,描述了我是如何在WPF中实现任意自定义笔划的,就像在Adobe中一样。我希望有帮助。