Win10系列:C#應用控制元件進階7
PathGeometry
前面介紹了Path的使用方法,接下來介紹PathGeometry類。PathGeometry提供了描繪由弧線、曲線和直線組成的多個複雜圖形的方法。PathGeometry的核心是PathFigure物件集合,PathFigure自身由一個或多個PathSegment子類物件組成,每個子類物件均描繪幾何圖形的一個片段。下面列出了PathFigure物件集合中常用的線段型別。
- LineSegment,在兩個點之間建立一條直線。
- BezierSegment,在兩個點之間建立一條三次方貝塞爾曲線,由起點(前一條線段的終點)、終點以及兩個控制點構成。
- ArcSegment,在兩個點之間建立一條橢圓弧線,通過設定
- PolyLineSegment,通過設定Points屬效能建立一系列直線。
- PolyBezierSegment,通過設定Points屬效能建立一系列三次方貝塞爾曲線。
- QuadraticBezierSegment ,通過設定Point1、Point2屬效能建立一條二次貝塞爾曲線。
- PolyQuadraticBezierSegment
接下來使用PathGeometry類繪製一個稍微複雜的圖形,PathGeometry並不會自我繪製,需要通過Path類輔助其呈現。下面的示例使用BezierSegment、LineSegment以及ArcSegment 來繪製幾何圖形。在一個開啟的Windows應用商店專案中新建一個空白頁,並命名為PathGeometryPage,雙擊開啟此頁面的PathGeometryPage.xaml檔案,在Grid元素中新增如下程式碼。
<Path Stroke="Blue" StrokeThickness="1" >
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure StartPoint="0,100">
<PathFigure.Segments>
<BezierSegment Point1="100,200" Point2="200,100" Point3="300,0"/>
<LineSegment Point="400,100" />
<ArcSegment Size="100,100" IsLargeArc="True" SweepDirection="Clockwise" Point="300,100"/>
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
上面的程式碼首先定義一個Path控制元件並設定Stroke屬性為藍色(Blue)、StrokeThickness屬性為1。接著在Path.Data中新增一個PathGeometry,並向PathGeometry.Figures中定義PathFigure物件集合,設定它的StartPoint屬性為(0,100)。通過給BezierSegment定義三個點來建立一個三次方貝塞爾曲線,這三個點是終點及兩個控制點。三次方貝塞爾曲線的兩個控制點的作用像磁鐵一樣,朝著自身的方向吸引本應為直線的部分,從而形成一條曲線。第一個控制點影響曲線的開始部分,第二個控制點影響曲線的結束部分。緊接著新增一個LineSegment,這個線段從BezierSegment的終點繪製到由LineSegment類的Point屬性所指定的點(400,100)。再定義一個ArcSegment,並用Size屬性設定此曲線的X軸半徑和Y軸半徑都為100,使用Point屬性指定終點為(300,100),最後定義ArcSegment的SweepDirection和IsLargeArc屬性分別為Clockwise、True,以便使圓弧順時針繪製並且弧度大於180度。
執行此頁面,PathGeometry繪製複雜圖形的執行效果如圖8-8所示。
圖8-8 PathGeometry繪製的圖形
接下來使用後臺程式碼繪製一個與前臺一樣的幾何圖形,具體程式碼如下所示:
public PathGeometryPage()
{
this.InitializeComponent();
//例項化Path物件
Windows.UI.Xaml.Shapes.Path mypath = new Windows.UI.Xaml.Shapes.Path();
mypath.Stroke = new SolidColorBrush(Colors.Blue);
mypath.StrokeThickness = 1;
//例項化PathFigure物件以容納多個Segment
PathFigure pathFigure = new PathFigure();
//設定起始點
pathFigure.StartPoint = new Point(0, 100);
//建立一條三次方貝塞爾曲線,前兩個是控制點,最後一個是終點
BezierSegment bezierSegment = new BezierSegment();
bezierSegment.Point1 = new Point(100, 200);
bezierSegment.Point2 = new Point(200, 100);
bezierSegment.Point3 = new Point(300, 0);
//例項化LineSegment類的物件
LineSegment lineSegment = new LineSegment();
lineSegment.Point = new Point(400, 100);
//建立一條橢圓弧線
ArcSegment arcSegment = new ArcSegment();
arcSegment.Size = new Size(100, 100);
arcSegment.RotationAngle = 45;
arcSegment.IsLargeArc = true;
arcSegment.Point = new Point(300, 100);
/*列舉型別可選值有Clockwise(順時針)與Counterclockwise(逆時針),
用於指定畫弧時的順時針或逆時針方向*/
arcSegment.SweepDirection = SweepDirection.Clockwise;
pathFigure.Segments.Add(bezierSegment);
pathFigure.Segments.Add(lineSegment);
pathFigure.Segments.Add(arcSegment);
//例項化Geometry物件
PathGeometry pathGeometry = new PathGeometry();
pathGeometry.Figures.Add(pathFigure);
//為Path.Data屬性賦值
mypath.Data = pathGeometry;
MyShow.Children.Add(mypath);
}
值得注意的是,對於名稱空間Windows.UI.XAML.Shapes.Path與System.IO.Path產生衝突的情況,解決辦法是在類前面加上名稱空間,如Windows.UI.Xaml.Shapes.Path mypath = new Windows.UI.Xaml.Shapes.Path()。
前面介紹了繪製路徑幾何圖形的基本原理,掌握了這些知識將會對以後的開發工作帶來幫助。在實際的繪製圖形的過程中,為了提升開發效率,讀者可以根據自身的需求選擇使用Blend for Visual studio開發工具,有關這個開發工具的知識可以檢視相關書籍進行學習。