1

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

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

4

2 回答 2

2

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

于 2011-02-04T03:21:56.077 回答
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 是由 PathFigure 组成的 PathGeometry,因此您可以简单地以编程方式访问这些段并创建更多 Path 对象。对于布局,由于每个 Path 本身都是一个新的 UIElement,其父级必须对其进行测量和排列,因此您需要将所有新 Path 放入一个布局面板中,以使它们保持相同的相对位置。

我认为有几种方法可以解决这个问题,但将它们完全重新组合在一起的一种方法是简单地将它们放在画布上,用它们的 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 中执行此操作。如果不是,请告诉我,我可以详细说明。

于 2011-02-04T02:54:24.083 回答