プログラムでパスを編集することはできますか?パスをプログラムで編集する
私は幅が動的な水平メーターとして機能するuserControlを作成しようとしています。私はxamlにパスを作成し、メートルの幅を動的に制御するintプロパティを持つことを計画しました。それは丸みを帯びているので、メーターの右端のx座標を編集してメーターを縮小することを計画していましたが、同じ丸い角を保ちます。パスのDataプロパティが表示されますが、編集方法はわかりません。
おそらくもっと良いアプローチはありますか?
プログラムでパスを編集することはできますか?パスをプログラムで編集する
私は幅が動的な水平メーターとして機能するuserControlを作成しようとしています。私はxamlにパスを作成し、メートルの幅を動的に制御するintプロパティを持つことを計画しました。それは丸みを帯びているので、メーターの右端のx座標を編集してメーターを縮小することを計画していましたが、同じ丸い角を保ちます。パスのDataプロパティが表示されますが、編集方法はわかりません。
おそらくもっと良いアプローチはありますか?
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>
の後ろにコードで変更することができ、あなたが名前
のいずれかによってPathFigure
と
LineSegment
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
それは素晴らしい仕事。ありがとう! – chief7