路径标记语法
WPF 中的形状和基本绘图概述和 Geometry 概述 中对路径进行了讨论,不过,本主题详细介绍功能强大、用法复杂的 mini-language,利用此语言并借助Extensible Application Markup Language (XAML),您可以更简洁地指定路径几何图形。
本主题包括以下部分。
先决条件
要了解本主题,您应当熟悉 Geometry 对象的基本功能。 有关更多信息,请参见 Geometry 概述。
StreamGeometry 和 PathFigureCollection Mini-Language
WPF 提供了 StreamGeometry 和 PathFigureCollection 这两个类,它们提供了描述几何路径的 mini-language。
当您在设置类型 Geometry 的属性(如 UIElement 的 Clip 属性或 Path 元素的 Data 属性)时,即使用了 StreamGeometry mini-language。 下面的示例使用特性语法创建 StreamGeometry。
<Path Stroke="Black" Fill="Gray" Data="M 10,100 C 10,300 300,-200 300,100" />
当设置 PathGeometry 的 Figures 属性时,即使用了 PathFigureCollection mini-language。 下面的示例使用特性语法创建 PathGeometry 的 PathFigureCollection。
<Path Stroke="Black" Fill="Gray"> <Path.Data> <PathGeometry Figures="M 10,100 C 10,300 300,-200 300,100" /> </Path.Data> </Path>
正如您从上述示例中所看到的,两种 mini-language 是非常相似的。 只要可以使用 StreamGeometry,便总是可以使用 PathGeometry;那么到底应该使用哪一个呢? 如果您在创建路径之后不需要对其进行修改,请使用 StreamGeometry;如果您需要修改路径,请使用 PathGeometry。
有关 PathGeometry 与 StreamGeometry 对象之间的差异的更多信息,请参见 Geometry 概述。
空格说明
为简洁起见,下文中的语法部分显示的是单个空格,实际上在使用单个空格的地方也可以使用多个空格。
并非一定要使用逗号或空格将两个数字隔开,但这只是针对结果字符串比较明确的情况。 例如,2..3 实际上表示两个数字:“2.”和“.3”。 同样,2-3 表示“2”和“-3”。 此外,命令前后的空格也不是必需的。
语法
StreamGeometry 的Extensible Application Markup Language (XAML) 特性用法语法由一个可选的 FillRule 值以及一个或多个图形说明组成。
StreamGeometry XAML 特性用法 |
---|
<object property="[fillRule] figureDescription[figureDescription]*" ... /> |
PathFigureCollection 的Extensible Application Markup Language (XAML) 特性用法语法由一个或多个图形说明组成。
PathFigureCollection XAML 特性用法 |
---|
<object property="figureDescription[figureDescription]*" ... /> |
术语 |
说明 |
---|---|
fillRule |
指定 StreamGeometry 使用 EvenOdd 还是 Nonzero FillRule。 如果省略此命令,则子路径使用默认行为,即 EvenOdd。 如果指定此命令,则必须将其置于最前面。 |
figureDescription |
图形由移动命令、绘制命令和可选的关闭命令组成。 moveCommanddrawCommands [closeCommand] |
moveCommand |
指定图形起点的移动命令。 请参见移动命令部分。 |
drawCommands |
一个或多个描绘图形内容的绘制命令。 请参见绘制命令部分。 |
closeCommand |
可选的关闭命令,用于关闭图形。 请参见关闭命令部分。 |
移动命令
指定新图形的起点。
语法 |
---|
M startPoint - 或 - m startPoint |
术语 |
说明 |
---|---|
startPoint |
新图形的起点。 |
大写的 M 指示 startPoint 是绝对值;小写的 m 指示 startPoint 是相对于上一个点的偏移量,如果是 (0,0),则表示不存在偏移。 当您在移动命令之后列出多个点时,即使您指定的是线条命令,也将绘制出连接这些点的线。
绘制命令
绘制命令可以由若干个形状命令组成。 可用的形状命令有:直线、水平线、垂直线、三次方贝塞尔曲线、二次贝塞尔曲线、平滑的三次方贝塞尔曲线、平滑的二次贝塞尔曲线以及椭圆弧线。
通过使用一个大写或小写字母输入各命令,其中大写字母表示绝对值,小写字母表示相对值。线段的控制点是相对于上述示例的终点而言的。 依次输入多个同一类型的命令时,可以省略重复的命令项;例如,L 100,200 300,400 等同于 L 100,200 L 300,400。 下表介绍了 move 和 draw 命令。
直线命令
在当前点与指定的终点之间创建一条直线。 l 20 30 和 L 20,30 都是有效的 line 命令示例。
语法 |
---|
L endPoint - 或 - l endPoint |
术语 |
说明 |
---|---|
endPoint |
线条的终点。 |
水平线命令
在当前点与指定的 x 坐标之间创建一条水平线。 H 90 是有效的水平线命令示例。
语法 |
---|
H x - 或 - h x |
术语 |
说明 |
---|---|
x |
线的终点的 x 坐标。 |
垂直线命令
在当前点与指定的 y 坐标之间创建一条垂直线。 v 90 是有效的垂直线命令示例。
语法 |
---|
V y - 或 - v y |
术语 |
说明 |
---|---|
y |
线的终点的 y 坐标。 |
三次方贝塞尔曲线命令
通过使用两个指定的控制点(controlPoint1 和 controlPoint2)在当前点与指定的终点之间创建一条三次方贝塞尔曲线。 C 100,200 200,400 300,200 是有效的曲线命令示例。
语法 |
---|
C controlPoint1 controlPoint2 endPoint - 或 - c controlPoint1 controlPoint2 endPoint |
术语 |
说明 |
---|---|
controlPoint1 |
曲线的第一个控制点,用于确定曲线的起始正切值。 |
controlPoint2 |
曲线的第二个控制点,用于确定曲线的终止正切值。 |
endPoint |
曲线将绘制到的点。 |
二次贝塞尔曲线命令
通过使用指定的控制点 (controlPoint) 在当前点与指定的终点之间创建一条二次贝塞尔曲线。 q 100,200 300,200 是有效的二次贝塞尔曲线命令示例。
语法 |
---|
Q controlPoint endPoint - 或 - q controlPoint endPoint |
术语 |
说明 |
---|---|
controlPoint |
曲线的控制点,用于确定曲线的起始和终止正切值。 |
endPoint |
曲线将绘制到的点。 |
平滑的三次方贝塞尔曲线命令
在当前点与指定的终点之间创建一条三次方贝塞尔曲线。 第一个控制点假定为前一个命令的第二个控制点相对于当前点的反射。 如果前一个命令不存在,或者前一个命令不是三次方贝塞尔曲线命令或平滑的三次方贝塞尔曲线命令,则假定第一个控制点就是当前点。 第二个控制点,即曲线终端的控制点,由 controlPoint2 指定。 例如,S 100,200 200,300 是一个有效的平滑三次方贝塞尔曲线命令。
语法 |
---|
S controlPoint2 endPoint - 或 - s controlPoint2 endPoint |
术语 |
说明 |
---|---|
controlPoint2 |
曲线的控制点,用于确定曲线的终止正切值。 |
endPoint |
曲线将绘制到的点。 |
二次贝塞尔曲线命令
在当前点与指定的终点之间创建一条二次贝塞尔曲线。 控制点假定为前一个命令的控制点相对于当前点的反射。 如果前一个命令不存在,或者前一个命令不是二次贝塞尔曲线命令或平滑的二次贝塞尔曲线命令,则此控制点就是当前点。
语法 |
---|
T controlPoint endPoint - 或 - t controlPoint endPoint |
术语 |
说明 |
---|---|
controlPoint |
曲线的控制点,用于确定曲线的起始正切值。 |
endPoint |
曲线将绘制到的点。 |
椭圆弧线命令
在当前点与指定的终点之间创建一条椭圆弧线。
语法 |
---|
A size rotationAngle isLargeArcFlag sweepDirectionFlag endPoint - 或 - a size rotationAngle isLargeArcFlag sweepDirectionFlag endPoint |
术语 |
说明 |
---|---|
size |
弧的 X 轴半径和 Y 轴半径。 |
rotationAngle |
椭圆的旋转度数。 |
isLargeArcFlag |
如果弧线的角度应大于或等于 180 度,则设置为 1;否则设置为 0。 |
sweepDirectionFlag |
如果弧线按照正角方向绘制,则设置为 1;否则设置为 0。 |
endPoint |
弧线将绘制到的点。 |
关闭命令
终止当前的图形并创建一条连接当前点和图形起点的线。 此命令在图形的最后一个线段与第一个线段之间创建一条连线(转角)。
语法 |
---|
Z - 或 - z |
点语法
描述点的 x 坐标和 y 坐标。
语法 |
---|
x,y - 或 - x y |
术语 |
说明 |
---|---|
x |
点的 x 坐标。 |
y |
点的 y 坐标。 |
特殊值
除标准数值以外,您还可以使用以下特殊值。 这些值区分大小写。
Infinity
表示 Double.PositiveInfinity。-Infinity
表示 Double.NegativeInfinity。NaN
表示 Double.NaN。
此外,您还可以使用科学计数法。 例如,+1.e17 是有效值。