移动和绘制命令语法
了解可用于将路径几何图形指定为 XAML 属性值的移动和绘制命令(微型语言)。 移动和绘制命令由许多设计和图形工具使用,这些工具可以输出矢量图形或形状,作为序列化和交换格式。
使用移动和绘制命令字符串的属性
XAML 的内部类型转换器支持移动和绘制命令语法,该转换器分析命令并生成运行时图形表示形式。 此表示形式基本上是一组已完成的矢量,可用于呈现。 矢量本身未完成演示详细信息;你仍需要在元素上设置其他值。 对于 Path 对象,还需要填充、笔划和其他属性的值,然后路径必须以某种方式连接到可视化树。 对于 PathIcon 对象,请设置 Foreground 属性。
Windows 运行时中有两个属性可以使用表示移动和绘制命令的字符串:Path.Data 和 PathIcon.Data。 如果通过指定移动和绘制命令来设置其中一个属性,通常将其设置为 XAML 属性值以及该元素的其他必需属性。 如果不进入细节,下面是如下所示的内容:
<Path x:Name="Arrow" Fill="White" Height="11" Width="9.67"
Data="M4.12,0 L9.67,5.47 L4.12,10.94 L0,10.88 L5.56,5.47 L0,0.06" />
使用移动和绘制命令与使用 PathGeometry
对于Windows 运行时 XAML,移动和绘制命令使用具有 Figures 属性值的单个 PathFigure 对象生成 PathGeometry。 每个绘图命令都会在该 PathFigure 的 Segments 集合中生成 PathSegment 派生类,移动命令将更改 StartPoint,并存在关闭的命令集 IsClosed 为 true。 如果在运行时检查 数据 值,则可以将此结构导航为对象模型。
基本语法
移动和绘制命令的语法可以如下所示进行汇总:
- 从可选的填充规则开始。 通常,仅当不希望 使用 EvenOdd 默认值时,才指定此值。 (有关 EvenOdd 稍后。
- 指定一个移动命令。
- 指定一个或多个绘图命令。
- 指定 close 命令。 可以省略关闭命令,但这会使你的数字保持打开状态(这并不常见)。
此语法的一般规则包括:
- 每个命令都由一个字母表示。
- 该字母可以是大写字母或小写字母。 案例很重要,如我们将介绍的那样。
- 除 close 命令外,每个命令通常后跟一个或多个数字。
- 如果命令有多个数字,请使用逗号或空格分隔。
[fillRule] moveCommand drawCommand [drawCommand*] [closeCommand]
许多绘图命令使用点,可在其中提供 x,y 值。 每当你看到 *points 占位符时,可以假设你为某个点的 x,y 值提供了两个十进制值。
当结果不明确时,通常会省略空格。 如果对所有数字集(点和大小)使用逗号作为分隔符,则可以省略所有空格。 例如,此用法是合法的: F1M0,58L2,56L6,60L13,51L15,53L6,64z
但是,为了清楚起见,在命令之间包含空白更为典型。
不要使用逗号作为十进制数的小数点;命令字符串由 XAML 解释,不考虑区域性特定的数字格式设置约定,这些约定不同于 en-us 区域设置中使用的约定。
语法细节
填充规则
可选填充规则有两个可能的值: F0 或 F1。 (The F 始终大写。 F0 是默认值;它生成 EvenOdd 填充行为,因此通常不指定它。 使用 F1 获取 Nonzero 填充行为。 这些填充值与 FillRule 枚举的值保持一致。
移动命令
指定新图形的起点。
语法 |
---|
M startPoint - 或 - m startPoint |
术语 | 说明 |
---|---|
startPoint | Point 新图形的起点。 |
大写 M 表示 startPoint 是绝对坐标;小写 m 表示 startPoint 是上一点的偏移量,或者(0,0)如果没有以前的点。
请注意 ,在移动命令后指定多个点是合法的。 将一条线绘制到这些点,就像指定了行命令一样。 但是,这不是推荐的样式;请改用专用行命令。
绘制命令
绘图命令可以包含多个形状命令:线条、水平线、垂直线、立方贝塞尔曲线、二次贝塞尔曲线、平滑立方贝塞尔曲线、平滑二次贝塞尔曲线和椭圆弧。
对于所有绘图命令,案例很重要。 大写字母表示绝对坐标,小写字母表示相对于上一个命令的坐标。
段的控制点相对于上一段的终点。 当按顺序输入多个相同类型的命令时,可以省略重复的命令输入。 例如,L 100,200 300,400
等效于 L 100,200 L 300,400
。
直线命令
在当前点和指定的终点之间创建一条直线。 l 20 30
和 L 20,30
是有效直线命令的示例。 定义 LineGeometry 对象的等效项。
语法 |
---|
L endPoint - 或 - l endPoint |
术语 | 说明 |
---|---|
endPoint | Point 线条的终点。 |
横线命令
在当前点和指定的 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
是有效曲线命令的示例。 使用 BezierSegment 对象定义 PathGeometry 对象的等效项。
语法 |
---|
C controlPoint1 controlPoint2 endPoint -或- c controlPoint1 controlPoint2 endPoint |
术语 | 说明 |
---|---|
controlPoint1 | Point 曲线的第一个控制点,它决定曲线的起始切线。 |
controlPoint2 | Point 曲线的第二个控制点,它决定曲线的结束切线。 |
endPoint | Point 绘制曲线将通过的点。 |
二次贝塞尔曲线命令
使用指定的控制点(controlPoint)在当前点和指定终点之间创建二次 Bézier 曲线。 q 100,200 300,200
是一个有效二次方贝塞尔曲线命令的示例。 使用 QuadraticBezierSegment 定义 PathGeometry 的等效项。
语法 |
---|
Q controlPoint endPoint -或- q controlPoint endPoint |
术语 | 说明 |
---|---|
controlPoint | Point 曲线的控制点,它决定曲线的开始和结束切线。 |
endPoint | Point 绘制曲线将通过的点。 |
平滑立方贝塞尔曲线命令
在当前点和指定的终点之间创建一个立方贝塞尔曲线。 假设第一控制点为相对当前点前一命令的第二控制点的反射。 如果没有上一个命令,或者如果上一个命令不是立方贝塞尔曲线命令或平滑立方贝塞尔曲线命令,则假定第一个控制点与当前点相吻合。 第二个控制点(曲线末尾的控制点)由 controlPoint2 指定。 例如, S 100,200 200,300
是有效的平滑立方贝塞尔曲线命令。 此命令使用 BezierSegment 定义 PathGeometry 的等效项,其中存在前面的曲线段。
语法 |
---|
S controlPoint2 端点 -或- s controlPoint2 endPoint |
术语 | 说明 |
---|---|
controlPoint2 | Point 曲线的控制点,它决定曲线的结束切线。 |
endPoint | Point 绘制曲线将通过的点。 |
平滑二次贝塞尔曲线命令
在当前点和指定的终点之间创建二次 Bézier 曲线。 假设控制点为相对于当前点前一命令的控制点的反射。 如果没有上一个命令,或者如果上一个命令不是二次 Bézier 曲线命令或平滑二次 Bézier 曲线命令,则控制点与当前点相吻合。 此命令使用 QuadraticBezierSegment 定义 PathGeometry 的等效项,其中存在前面的曲线段。
语法 |
---|
T controlPoint 端点 -或- t controlPoint 端点 |
术语 | 说明 |
---|---|
controlPoint | Point 曲线的控制点,决定曲线的起点和曲线的切线。 |
endPoint | Point 绘制曲线将通过的点。 |
椭圆弧命令
在当前点和指定的终点之间创建一个椭圆弧。 使用 ArcSegment 定义 PathGeometry 的等效项。
语法 |
---|
A 大小 rotationAngle isLargeArcFlag sweepDirectionFlag endPoint -或- a 大小 rotationAngle isLargeArcFlag sweepDirectionFlag endPoint |
术语 | 说明 |
---|---|
size | 大小 弧的 x 半径和 y 半径。 |
rotationAngle | 双精度 椭圆的旋转,以度为单位。 |
isLargeArcFlag | 如果圆弧角度应为 180 度或更大,请设置为 1,否则设置为 0。 |
sweepDirectionFlag | 如果以正角方向绘制圆弧,请设置为 1;否则设置为 0。 |
endPoint | Point 绘制弧将通过的点。 |
关闭命令
结束当前图形,并创建一条将当前点连接到图形起点的直线。 此命令可以在图形最后一段与第一段之间创建一条连接线(角)。
语法 |
---|
Z -或- z |
点语法
描述点的 x 坐标和 y 坐标。 另请参阅 Point。
语法 |
---|
x,y -或- xy |
术语 | 说明 |
---|---|
x | 双精度 该点的 x 坐标。 |
y | 双精度 该点的 y 坐标。 |
其他说明
除了标准数值外,还可使用以下特殊值。 这些值区分大小写。
- 无穷大:表示正无穷大。
- -Infinity:表示 NegativeInfinity。
- NaN:表示 NaN。
可以使用科学表示法,而不是使用小数或整数。 例如,+1.e17
是一个有效值。
生成移动和绘制命令的设计工具
在 Blend for Microsoft Visual Studio 2015 中使用触控笔工具和其他绘图工具通常会生成 Path 对象,并带有移动和绘制命令。
你可能会在控件Windows 运行时 XAML 默认模板中定义的某些控件部件中看到现有的移动和绘制命令数据。 例如,某些控件使用 PathIcon ,其中包含定义为移动和绘制命令的数据。
有一些导出程序或插件可用于其他常用的矢量图形设计工具,这些工具可以以 XAML 形式输出矢量。 这些对象通常在布局容器中创建 Path 对象,并为 Path.Data 移动和绘制命令。 XAML 中可能有多个 Path 元素,以便可以应用不同的画笔。 其中许多导出程序或插件最初是为 Windows Presentation Foundation (WPF) XAML 或 Silverlight 编写的,但 XAML 路径语法与 Windows 运行时 XAML 相同。 通常,可以使用导出程序中的 XAML 区块并将其直接粘贴到Windows 运行时 XAML 页面中。 (但是,你将无法使用RadialGradientBrush(如果这是已转换的 XAML 的一部分),因为Windows 运行时 XAML 不支持该画笔。