2
是否可以通過編程方式編輯路徑?以編程方式編輯路徑
我試圖創建一個userControl作爲一個寬度動態的水平儀。我在xaml中創建了一個路徑,並計劃使用一個int屬性來動態地控制流量計的寬度。它具有圓形邊緣,所以我計劃編輯儀表右端的x座標以縮小儀表,但保持相同的圓角。我在路徑上看到Data屬性,但不明白我如何編輯它。
有沒有更好的方法,或許?
是否可以通過編程方式編輯路徑?以編程方式編輯路徑
我試圖創建一個userControl作爲一個寬度動態的水平儀。我在xaml中創建了一個路徑,並計劃使用一個int屬性來動態地控制流量計的寬度。它具有圓形邊緣,所以我計劃編輯儀表右端的x座標以縮小儀表,但保持相同的圓角。我在路徑上看到Data屬性,但不明白我如何編輯它。
有沒有更好的方法,或許?
如果您直接設置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的背後,你可以按名稱
訪問PathFigure
和
LineSegment
小號無論是
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);
}
}
}
}
這很好。謝謝! – chief7 2011-02-13 12:27:18