WPF中文网

Path路径

public sealed class Path : Shape
{
    public static readonly DependencyProperty DataProperty;

    public Path();

    public Geometry Data { get; set; }

    protected override Geometry DefiningGeometry { get; }
}

从定义上看,Path只有一个Data属性,这个属性的类型为Geometry。而Geometry又是一个抽象类,所以我们不能直接使用它,那它肯定会有一系列可以实例化的子类。没错,Geometry表示一个几何,而几何的图形可以分为好几种。

几何名称说明
LineGeometry直线几何
RectangleGeometry矩形几何
EllipseGeometry椭圆几何
PathGeometry路径几何
StreamGeometryPathGeometry的轻量级替代品,不支持 Bidning、动画等功能
CombinedGeometry多图形组合,形成单一几何几何图形
GeometryGroup多图形组合,形成几何图形组

接下来,我们分别讲一下这几种几何的用法。

一、LineGeometry直线几何

<Path Stroke="Blue" Fill="Red">
    <Path.Data>
        <LineGeometry  StartPoint="10,20" EndPoint="100,200"/>
    </Path.Data>
</Path>

二、RectangleGeometry矩形几何

<Path Stroke="Blue" Fill="Red">
    <Path.Data>
        <RectangleGeometry Rect="50,20,30,40" />
    </Path.Data>
</Path>

三、EllipseGeometry椭圆几何

<Path Stroke="Yellow" Fill="LightGreen">
    <Path.Data>
        <EllipseGeometry Center="150,80" RadiusX="60" RadiusY="50"/>
    </Path.Data>
</Path>

从上面的3个例子来看,Line、Rectangle、Ellipse控件能够画出来的效果,Path都可以画出来。而接下来我们要分享的是,Line、Rectangle、Ellipse控件画不出来的效果,Path也能画出来。那就是PathGeometry路径几何。

四、PathGeometry路径几何

PathGeometry微微有点复杂。它有一个Figures属性,可以容纳很多较复杂的图形。Figures是一个集合,其中的元素是PathFigure类型,而PathFigure中的Segments属性又是一个集合,其中的元素类型为PathSegment。

PathSegment是一个抽象类,我们可以实例化PathSegment的子类放到PathFigure中,然后把PathFigure放到PathGeometry中,这样就可以绘制不同的路径图形了。那么PathSegment有哪些子类呢?

LineSegment直线段
ArcSegment圆弧线段
BezierSegment三次方贝塞尔曲线段
QuadraticBezierSegmnt二次方贝塞尔曲线段
PolyLineSegment折线段
PolyBezierSegment多三次方贝塞尔曲线段
PolyQuadraticBezierSegment多二次方贝塞尔曲

PathFigure有一个StartPoint属性表示起点坐标,而Segments集合中的元素就是上面那张表中的各种线段实例,它们将依次首尾相接,最终绘制成形。

我们以LineSegment和ArcSegment为例。

<Path Stroke="Black" Fill="LightPink" StrokeThickness="5">
    <Path.Data>
        <PathGeometry>
            <PathGeometry.Figures>
                <PathFigure StartPoint="150,200">
                    <LineSegment  Point="300,200"/>
                    <ArcSegment Point="300 50" 
                                Size="100 100" 
                                SweepDirection="Clockwise" 
                                IsLargeArc="False"/>
                    <ArcSegment Point="300 200" 
                                Size="100 100" 
                                SweepDirection="Clockwise" 
                                IsLargeArc="False"/>
                </PathFigure>
            </PathGeometry.Figures>
        </PathGeometry>
    </Path.Data>
</Path>

首先,PathFigure 图形的起点坐标为(150,200),然后第一个元素是线段,终点坐标为(300,200),图形的坐标原点是左上角(0,0),所以,往下就是Y轴正半轴方向,往右就是X轴正半轴方向。

然后,画了两条圆弧,第一条圆弧的起点坐标就是线段的终点坐标,即(300,200),圆弧的终点坐标为(300 50),大小为(100 100),第二条圆弧的终点坐标又回到了线段的终点坐标(300 200),于是就出现了图中的样子。

ArcSegment的常用属性如下:
Point:指明圆弧连接的终点;
Size:指明完整椭圆的横轴半径和纵轴半径;
IsLargeArc:指明是否使用大弧去连接 ;
SweepDirection :指明圆弧是顺时针方向还是逆时针方向;
RotationAngle:指明圆弧椭圆的旋转角度;

接下来,我们再讲一下BezierSegment贝塞尔曲线。

BezierSegment需要4个坐标点来完成图形的绘制,分别是起点,控制点1,控制点2和终点。

<PathFigure IsFilled="False" StartPoint="5,5">
    <BezierSegment Point1="200,50" Point2="50,200"  Point3="350,250"/>
</PathFigure>

如上所示,(5,5)表示起点(StartPoint属性),Point1属性(200,50)和Point2属性(50,200)表示两个控制点,Point3属性(350,250)表示终点。

五、Path的标记语法

通过上面的示例我们会发现要绘制复杂的图形,需要实例化各种子类,代码繁琐,这时就需要了解Path的路径标记语法,它大大减少了代码量。您可以从以下的表格或微软官网中获得相关知识。

命令用途语法示例对应标签语法
M移动到起点坐标M 起点M 150,200<PathFigure StartPoint="150,200">
L绘制直线L 终点L 300,200<LineSegment Point="300,200"/>
H水平直线H 终点横坐标
V垂直直线V 终点横坐标
A绘制圆弧A 母椭圆尺寸 旋转角度 是否大弧 顺时针/逆时针 终点A 180,80 45 1 1 150,150<ArcSegment Size="180,80" RotationAngle="45" IsLargeArc="True" SweepDirection="Clockwise" Point="150,150" />
C三次方贝塞尔曲线C 控制点1 控制点2 终点C 200,50 50,200 350,250<BezierSegment Point1="200,50" Point2="50,200" Point3="350,250"/>
Q二次方贝塞尔曲线Q 控制点1 终点Q 200,50 350,250<QuadraticBezierSegmnt Point1="200,50" Point3="350,250"/>
S平滑三次方贝塞尔曲线S 控制点2 终点S 200,50 350,250
T平滑二次方贝塞尔曲线T 终点T 350,250
Z闭合图形ZM 10,150 L40,150 L40,250 L10,250 Z<Path Fill="HotPink" Data="M 10,150 L40,150 L40,250 L10,250 Z" />
<Path Fill="HotPink" Data="M 10,150 L40,150 L40,250 L10,250 Z"/>

最后,我们通过Path的路径标记语法画了一个封闭的矩形图形,可以看到代码量的书写大大减少了。

当前课程源码下载:(注明:本站所有源代码请按标题搜索)

文件名:082-《Path路径》-源代码
链接:https://pan.baidu.com/s/1yu-q4tUtl0poLVgmcMfgBA
提取码:wpff

——重庆教主 2023年10月20日

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1