2011-02-09 12 views
2

プログラムでパスを編集することはできますか?パスをプログラムで編集する

私は幅が動的な水平メーターとして機能するuserControlを作成しようとしています。私はxamlにパスを作成し、メートルの幅を動的に制御するintプロパティを持つことを計画しました。それは丸みを帯びているので、メーターの右端のx座標を編集してメーターを縮小することを計画していましたが、同じ丸い角を保ちます。パスのDataプロパティが表示されますが、編集方法はわかりません。

おそらくもっと良いアプローチはありますか?

答えて

4

Path.Dataを直接設定している場合、コードの背後で編集することはできません。それを可能にしたい場合は、PathGeometryを代わりに使用する必要があります。 MSDNから

あなたが前の の例からわかるように、2つのミニ言語は 非常に似ています。 StreamGeometryを使用できる任意の状況でいつでもPathGeometryを使用することが可能です。 どちらを使いますか? StreamGeometryを使用する場合は、作成後にパスを変更する必要がない場合は を使用してください。 をPathGeometryに変更する必要がある場合は、 パスを変更してください。

次の二つのパスの、等価です後に1が背後にあるコードでMyPath2を変更するには

<!-- 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> 

の後ろにコードで変更することができ、あなたが名前

のいずれかによって PathFigureLineSegment Sにアクセスすることができます
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); 
      } 
     } 
    } 
} 
のような10
+0

それは素晴らしい仕事。ありがとう! – chief7

関連する問題