以编程方式将路径拆分为多个路径

时间:2011-02-04 02:27:19

标签: wpf pathgeometry

我有一个动态生成的路径,其数据由PathGeometry组成的PathFigure组成。此PathFigure包含许多线段。所以整个路径是连续的,由直线组成。将这条路径分成许多不同的小路径的好方法是什么?如果你很好奇,我需要这样做的原因是为了实现“消失的路径”效果,并且似乎没有其他方法可以做到这一点。

所以我想采取一条路径,并将其拆分为许多不同的小路径,然后我将第一个小路径的不透明度设置为0,将最后一个小路径设置为1,并插入其间的所有内容。此外,我可以使用它来使路径的尾部变小,并插入到路径的头部,这是很大的。有很多用途 - 我需要一种方法来为我的应用程序执行此操作。

2 个答案:

答案 0 :(得分:2)

请参阅Charles Petzold的GradientPath,它的实现类似于您的描述,如果您想添加对改变路径宽度的支持,则应该很容易调整。

答案 1 :(得分:0)

听起来您可以简单地使用线性渐变画笔来表示路径的笔触颜色,以实现路径渐变的相同效果,而不是分割路径。例如,尝试在路径上设置下方的画笔。

在Xaml中:

        <Path.Stroke>
            <LinearGradientBrush>
                <GradientStop Color="#00000000" Offset="0.0"/>
                <GradientStop Color="#FF000000" Offset="1.0"/>
            </LinearGradientBrush>
        </Path.Stroke>

在C#中:

        var brush = new LinearGradientBrush();
        brush.GradientStops.Add(new GradientStop(new Color { A = 0, R = 0, B = 0, G = 0 }, 0.0));
        brush.GradientStops.Add(new GradientStop(new Color { A = 255, R = 0, B = 0, G = 0 }, 1.0));
        this._path.Stroke = brush;

另外,要解决原始问题,无论上述内容是否正在寻找,您都可以选择分割路径。由于您知道Data是由PathFigures组成的PathGeometry,因此您只需以编程方式访问这些段并创建更多Path对象。对于布局,因为每个Path本身都是一个新的UIElement,其父级必须对其进行测量和排列,所以需要将所有新路径放入布局面板中,以使它们保持相同的相对位置。

我认为有几种方法可以解决这个问题,但是将它们重新组合在一起的一种方法是简单地将它们放在画布上,并使用Canvas.Top和Canvas.Left(或.Right,.Bottom,具体取决于它们)关于如何布局它们)设置路径中每个段开头的相对偏移量,并调整点以使它们相对于新路径的新左上角。例如,这个

    <Path Stroke="Black">
        <Path.Data>
            <PathGeometry>
                <PathFigure>
                    <LineSegment Point="10,10"/>
                    <LineSegment Point="20,60"/>
                    <LineSegment Point="70,60"/>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>

可以变得像

    <Path Stroke="Black">
        <Path.Data>
            <PathGeometry>
                <PathFigure>
                    <LineSegment Point="10,10"/>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>
    <Path Stroke="Black" Canvas.Top="10" Canvas.Left="10">
        <Path.Data>
            <PathGeometry>
                <PathFigure>
                    <LineSegment Point="10,50"/>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>
    <Path Stroke="Black" Canvas.Top="60" Canvas.Left="20">
        <Path.Data>
            <PathGeometry>
                <PathFigure>
                    <LineSegment Point="50,0"/>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>

应该清楚如何通过在C#中给出PathGeometry对象来构造多个Path来实现这一点,因为听起来你可能没有在你的问题中在XAML中这样做。如果不是,请告诉我,我可以详细说明。