以编程方式编辑路径

时间:2011-02-09 03:36:04

标签: silverlight

是否可以通过编程方式编辑路径?

我正在尝试创建一个userControl,它充当宽度为动态的水平仪表。我在xaml中创建了一个路径,并计划使用一个int属性来动态控制仪表的宽度。它有圆边,所以我计划编辑仪表右端的x坐标以缩小仪表,但保持相同的圆角。我在路径上看到了Data属性,但是我不知道如何编辑它。

或许有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

如果您直接设置Path.Data,则无法在后面的代码中对其进行编辑。如果您希望能够这样做,则应使用PathGeometry代替。来自MSDN

  

从前面的内容可以看出   例子,这两种迷你语言是   非常相似。它始终是可能的   在任何情况下都使用PathGeometry   你可以在哪里使用StreamGeometry;   你应该使用哪一个?用一个   不需要时StreamGeometry   创建后修改路径;使用   如果确实需要,可以使用PathGeometry   修改路径。

以下两个路径是等效的,后面的路径可以在

后面的代码中修改
<!-- Path 1: Using StreamGeometry -->
<Path x:Name="MyPath"
      Stroke="Black"
      StrokeThickness="10"
      Margin="20"
      Data="M 10,10 L 100,10 L 100,200 L 10,200 Z"/>
<!-- Path 2: Using PathGeometry-->
<Path x:Name="MyPath2"
    Stroke="Black"
    StrokeThickness="10"
    Margin="20">
    <Path.Data>
        <PathGeometry>
            <PathGeometry.Figures>
                <PathFigure x:Name="figure1" StartPoint="10, 10" IsClosed="True">
                    <LineSegment x:Name="line1" Point="100, 10"/>
                    <LineSegment x:Name="line2" Point="100, 200"/>
                    <LineSegment x:Name="line3" Point="10, 200"/>
                </PathFigure>
            </PathGeometry.Figures>
        </PathGeometry>
    </Path.Data>
</Path>

要修改后面代码中的MyPath2,您可以按名称访问PathFigureLineSegment

private void MovePathHorizontally()
{
    figure1.StartPoint = new Point(figure1.StartPoint.X + 10, figure1.StartPoint.Y);
    line1.Point = new Point(line1.Point.X + 10, line1.Point.Y);
    line2.Point = new Point(line2.Point.X + 10, line2.Point.Y);
    line3.Point = new Point(line3.Point.X + 10, line3.Point.Y);
}

或者像这样

private void MovePathHorizontally()
{
    PathGeometry pathGeometry = MyPath2.Data as PathGeometry;
    PathFigureCollection pathFigures = pathGeometry.Figures;
    foreach (PathFigure pathFigure in pathFigures)
    {
        pathFigure.StartPoint = new Point(pathFigure.StartPoint.X + 10, pathFigure.StartPoint.Y);

        PathSegmentCollection pathSegments = pathFigure.Segments;
        foreach (PathSegment pathSegment in pathSegments)
        {
            if (pathSegment is LineSegment)
            {
                LineSegment lineSegment = pathSegment as LineSegment;
                lineSegment.Point = new Point(lineSegment.Point.X + 10, lineSegment.Point.Y);
            }
        }
    }
}