当前位置:网站首页>win10 uwp win2d 使用 Path 绘制界面
win10 uwp win2d 使用 Path 绘制界面
2022-08-04 18:37:00 【林德熙】
本文告诉大家如何在 Win2d 使用 Path 路径绘图
CanvasGeometry
在 win2d ,可以使用 DrawGeometry 的方式画出几何。而路径 Path 就是一种 Geometry 。传入的 CanvasGeometry 参数是不能通过实例创建,需要使用静态工厂创建。
通过 CanvasGeometry.CreatePath 就可以创建出路径几何,通过告诉线条颜色和线条宽度就可以画出 Path ,这个方法只能画出线条。
如果需要填充 Path 需要使用 FillGeometry 方法。
CanvasPathBuilder
因为 CanvasGeometry.CreatePath 的参数是 CanvasPathBuilder ,而 Path 也需要告诉每个点是如何画,所以需要 CanvasPathBuilder 来告诉 Path 每个点是怎么画。
在创建 CanvasPathBuilder 的时候需要传入 ICanvasResourceCreator ,也就是通过 args.DrawingSession 可以创建 CanvasPathBuilder 来画。
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
上面的代码是写在 Canvas_OnDraw
private void Canvas_OnDraw(CanvasControl sender, CanvasDrawEventArgs args)
{
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
}
}
因为Path 可以使用多个 Path 组合,如果需要新建一个 Path 需要调用 BeginFigure 告诉 win2d 开始画出一个新的图形。在图形画完需要调用 EndFigure 告诉 win2d 已经画完。
例如准备画一条线,需要在开始画的时候调用 BeginFigure 告诉起点,在结束的时候使用 EndFigure 并且告诉这是不是封闭图形。
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
canvasPathBuilder.BeginFigure(100,100);
canvasPathBuilder.AddLine(200,100);
canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);
}
现在运行代码会发现没有画出图形,因为没有调用画出来。调用 DrawGeometry 需要传入需要画的几何、线条颜色,线条宽度
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
canvasPathBuilder.BeginFigure(100, 100);
canvasPathBuilder.AddLine(200, 100);
canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);
args.DrawingSession.DrawGeometry(CanvasGeometry.CreatePath(canvasPathBuilder), Colors.Gray, 2);
}
画线
从上面的例子已经告诉大家如何画线,使用 BeginFigure 添加起点,然后使用 AddLine 把上一个点和输入的连成直线。
using (var canvasPathBuilder = new CanvasPathBuilder(args.DrawingSession))
{
// 这里可以画出 Path 或写出文字 lindexi.github.io
canvasPathBuilder.BeginFigure(100, 100);
canvasPathBuilder.AddLine(200, 100);
canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);
}
例子
下面给大家看一些已经画好的路径界面
绘制坐标系
private void DrawPath(CanvasControl canvas, CanvasDrawEventArgs args)
{
var width = (float) canvas.ActualWidth-20;
var height = (float) (canvas.ActualHeight)-20;
var midWidth = (float) (width * .5);
var midHeight = (float) (height * .5);
Color color = Colors.Gray;
using (var cpb = new CanvasPathBuilder(args.DrawingSession))
{
// Horizontal line
// 水平线
cpb.BeginFigure(new Vector2(0, midHeight));
cpb.AddLine(new Vector2(width, midHeight));
cpb.EndFigure(CanvasFigureLoop.Open);
// Horizontal line arrow
// 水平箭头
cpb.BeginFigure(new Vector2(width - 10, midHeight - 3));
cpb.AddLine(new Vector2(width, midHeight));
cpb.AddLine(new Vector2(width - 10, midHeight + 3));
cpb.EndFigure(CanvasFigureLoop.Open);
args.DrawingSession.DrawGeometry(CanvasGeometry.CreatePath(cpb), color,strokeWidth: 1);
}
using (var cpb = new CanvasPathBuilder(args.DrawingSession))
{
// Vertical line
// 垂直线
cpb.BeginFigure(new Vector2(midWidth, 0));
cpb.AddLine(new Vector2(midWidth, height));
cpb.EndFigure(CanvasFigureLoop.Open);
// Vertical line arrow
cpb.BeginFigure(new Vector2(midWidth - 3, 10));
cpb.AddLine(new Vector2(midWidth, 0));
cpb.AddLine(new Vector2(midWidth + 3, 10));
cpb.EndFigure(CanvasFigureLoop.Open);
args.DrawingSession.DrawGeometry(CanvasGeometry.CreatePath(cpb), color, 1);
}
}
边栏推荐
- MySQL安装教程(详细)
- 如何封装 svg
- 阿里云技术专家秦隆:云上如何进行混沌工程?
- Literature Review on Involution of College Students
- Babbitt | Metaverse daily must-read: Weibo animation will recruit all kinds of virtual idols around the world and provide support for them...
- VPC2187/8 current mode PWM controller 4-100VIN ultra-wide voltage startup, highly integrated power control chip recommended
- gbase8s创建RANGE分片表
- 数仓建模面试
- DHCP&OSPF组合实验演示(Huawei路由交换设备配置)
- Scala104-Spark.sql的内置日期时间函数
猜你喜欢
随机推荐
动态数组底层是如何实现的
【简答题】月薪4k和月薪8k的区别就在这里
The Industrial Metaverse Brings Changes to Industry
如何进行自动化测试?
路由懒加载
Google AppSheet: 无需编程构建零代码应用
EasyCVR调用云端录像API接口返回错误且无录像文件生成,是什么原因?
防火墙基础之防火墙做出口设备安全防护
Enterprise survey correlation analysis case
作业8.3 线程同步互斥机制条件变量
阿里云国际版使用ROS搭建WordPress教程
如何进行自动化测试?
【web自动化测试】playwright安装失败怎么办
BigDecimal 使用注意!!“别踩坑”
flink-cdc支持并行读取一张mysql表的binlog不?
EuROC dataset format and related codes
[Distributed Advanced] Let's fill in those pits in Redis distributed locks.
Literature Review on Involution of College Students
开篇-开启全新的.NET现代应用开发体验
如何给MySQL添加自定义语法 ?