2011-02-09 111 views
2

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

我试图创建一个userControl作为一个宽度动态的水平仪。我在xaml中创建了一个路径,并计划使用一个int属性来动态地控制流量计的宽度。它具有圆形边缘,所以我计划编辑仪表右端的x坐标以缩小仪表,但保持相同的圆角。我在路径上看到Data属性,但不明白我如何编辑它。

有没有更好的方法,或许?

回答

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

这很好。谢谢! – chief7 2011-02-13 12:27:18