1. 程式人生 > >Win10系列:C#應用控制元件進階7

Win10系列:C#應用控制元件進階7

PathGeometry

前面介紹了Path的使用方法,接下來介紹PathGeometry類。PathGeometry提供了描繪由弧線、曲線和直線組成的多個複雜圖形的方法。PathGeometry的核心是PathFigure物件集合,PathFigure自身由一個或多個PathSegment子類物件組成,每個子類物件均描繪幾何圖形的一個片段。下面列出了PathFigure物件集合中常用的線段型別。

  • LineSegment,在兩個點之間建立一條直線。
  • BezierSegment,在兩個點之間建立一條三次方貝塞爾曲線,由起點(前一條線段的終點)、終點以及兩個控制點構成。
  • ArcSegment,在兩個點之間建立一條橢圓弧線,通過設定
    Size屬性確定X軸半徑和Y軸半徑的大小,定義Point屬性可以設定橢圓弧的終點。只有SizePoint屬性並不能完全確定弧線的形狀,ArcSegment 還有SweepDirectionIsLargeArc兩個屬性,分別設定以順時針或逆時針方向繪製弧線和弧線的弧度是否應大於180度。
  • PolyLineSegment,通過設定Points屬效能建立一系列直線。
  • PolyBezierSegment,通過設定Points屬效能建立一系列三次方貝塞爾曲線。
  • QuadraticBezierSegment ,通過設定Point1Point2屬效能建立一條二次貝塞爾曲線。
  • PolyQuadraticBezierSegment
    ,通過設定Points屬效能建立一系列二次貝塞爾曲線。

接下來使用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開發工具,有關這個開發工具的知識可以檢視相關書籍進行學習。