ch08 二维绘图控件
操作等与 HTML 的 Canvas 几乎一样.
控件概览
涉及到的控件
控件 | 描述 |
---|---|
Ellipse | 绘制椭圆. |
Line | 绘制线. |
Path | 绘一组线和曲线. |
Polygon | 绘制多个点连接而成的多边形, 最后一个点会与第一个形成闭合图形. |
Polyline | 绘制多条折线. |
Rectangle | 绘制矩形. |
笔触属性
绘制图形本质上就是绘制线条, 涉及到线条样式, 颜色等. 这里是常用的绘制属性:
属性 | 描述 |
---|---|
Fill | 控件背景画刷 (类似于其他控件的 Background 属性). |
Stroke | 绘制控件的边界. |
StrokeDashArray | 数组 (逗号分隔), 表示虚线实部与虚部的长度. 这个长度会伴随绘制线的粗细而缩放. 例如长度为 1, 但线宽是 5 像素, 那么绘制时, 会以 5 像素为长度. |
StrokeDashCap | 描述折线端点样式, 可取值为: Flat , Round , Square , Triangle . 其中 Flat 是按照线长精确结束. 其他会在结束位置加上一个 "帽子". |
StrokeDashOffset | 开始绘制的起点与设定起点的偏移值. |
StrokeEndLineCap | 描述线端点的样式, 可取值为 Flat , Round , Square , Triangle . |
StrokeLineJoin | 处理 Rectangle , Polyline , Polygon , Path 相邻线段之间如何转折. 可取值有: Miter , Round , Bevel . |
StrokeStartLineCap | |
StrokeThickness | 设置线宽. |
Ellipse
Ellipse
控件绘制一个简单椭圆, 虽然它也有常用的事件, 但一般不会与用户交互. 该控件没有子组件.
Ellipse
的 Width
, Height
决定了控件的尺寸, 其定位取决于容器控件. 如果忽略 Width
, Height
, 仅用 Margin
可以创建出与容器适配可变的椭圆.
LINE
绘制一条直线, 其属性 X1
, Y1
和 X2
, Y2
来决定位置. 该控件不含子控件, 且一般不会与用户交互.
需要设置颜色
Stroke
, 否则看不到.可以将该控件想想成一个矩形, 由
Width
和Height
来控制, 然后在该矩形内部进行坐标计算, 绘制矩形. 即(0, 0)
是该矩形内部的左上角位置.
PATH
Path
控件用于绘制一系列折线, 圆弧, 贝塞尔曲线, 以及其图形. 可以使用子对象来定义图形, 但是通常使用的是 Path mini-language.
Path Mini-Language
要使用 Path Mini-Language 需要给控件提供一个 Data
属性. Data
属性会包含一组绘图命令简写. 这些指令会使用统一的坐标系, 来确定绘图位置.
案例说明: M41,3 L2,70 78,32 3,19 59,69, 41,3
其中
M
是指Move
, 即移动到41,3
的位置. 坐标都使用 逗号 分隔.然后
L
是指Line
, 即绘制折线, 所用坐标点在后续给出, 每一个组标点使用空格分隔. 坐标分量用逗号分隔. 按照语法, 可以使用逗号或空格(即都是可以的).
绘制指令的大小写还有特定含义, 大写表示使用绝对坐标, 小写表示相对于前一个点的相对坐标.
命令可以带有参数, 参数紧跟其后, 参数可以使用空格或逗号分隔.
绘制命令如下:
命令 | 含义 |
---|---|
F0 | 使用奇/偶填充规则. |
F1 | 使用非零填充规则. |
M 或 m | 移动到指定点. |
L 或 l | 根据点绘制折线. |
H 或 h | 根据给定 X 绘制水平直线. 其含义是从当前位置绘制到给定 X 的位置, Y 不变. |
V 或 v | 根据给定的 Y 坐标绘制竖直直线. 其含义是从当前位置绘制到给定 Y 的位置, X 不变. |
C 或 c | 绘制三次贝塞尔曲线. 该指令带有三个点坐标的参数. 两个控制点, 和一个结束端点. 绘制时从当前点开始. |
S 或 s | 绘制光滑的贝塞尔曲线. 该命令带有两个参数: 一个控制点, 另一个是结束端点. 绘制从当前位置开始. 该命令是一个续接命令, 使用前一个的 S 的结束端点作为第一个控制点, 然后绘制三次贝塞尔曲线, 然后延续下去. |
Q 或 q | 绘制二次贝塞尔曲线, 该命令带有两个参数, 一个控制点, 一个结束端点. 绘制从当前位置开始. |
T 或 t | 使用一个点来绘制平滑的贝塞尔曲线. 其作用与 S 命令类似, 使用前一个点作为第一控制点, 然后延续绘制二次贝塞尔曲线. |
A 或 a | 绘制一个椭圆弧. 该命令有五个参数, 从当前位置开始绘制. size 表示 X, Y 轴上的弧半径 (可能是长短轴半径).rotation_angle 表示椭圆的旋转角度.large_angle 取值为 0 或 1, 表示圆弧的角度, 0 表示劣弧, 1 表示优弧.sweep_direction 取值 0 或 1, 表示旋转方向, 0 表示逆时针, 1 表示顺时针.end_point 表示圆弧结束点. |
Z 或 z | 是否绘制成闭合曲线. 从当前位置到起点位置. 该指令不带参数. |
Path 存储对象
Path
可以自己绘制图形, 也可以存放子元素表示图形. 例如
<Path Stroke=”Red” StrokeThickness=”5”>
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint=”60,20”>
<PathFigure.Segments>
<PathSegmentCollection>
<PolyQuadraticBezierSegment
Points=”140,150 140,50 140,00 30,100”/>
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
POLYGON
根据给出的点 (Points
属性) 绘制多边形, 最后一个点与第一个点形成闭合图形.
POLYLINE
根据给出的点 (Points
属性) 绘制折线, 不同于 Polygon
最后一个点与第一个点不会连接.
需要注意的是, 即使结束点与起点重合, Polyline
也没有办法绘制出与 Polygon
一样的多边形, 这是因为相邻折线的转角方式是不同的. 除非多绘出一部分, 将转角包含到路径中.
与 Canvas 一模一样.
RECTANGLE
绘制简单矩形, 属性用法与 Ellipse
一样, 布局取决于容器控件.