【问题标题】:Edit Path Programmatically以编程方式编辑路径
【发布时间】:2011-02-09 03:36:04
【问题描述】:

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

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

也许有更好的方法?

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    如果您直接设置 Path.Data,您将无法在后面的代码中对其进行编辑。如果你想这样做,你应该使用PathGeometry。来自MSDN

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

    以下两个Path是等价的,后面的可以在后面的代码中修改

    <!-- 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,您可以通过名称访问 PathFigureLineSegments

    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);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 2010-09-21
      • 1970-01-01
      • 2011-06-24
      相关资源
      最近更新 更多