概述

有时候我们的程序界面中需要显示一些简单的示意图,一般我们有原图的话直接嵌入我们程序就可以,但有时候我们没有原图,这时候我们不妨用代码自己画出来.

今天小编要给大家展示的是这样一副图片:

接下来,我就用代码纯手动给画出来。

绘制说明

①  首先绘制一个圆:

var elip = new Ellipse();elip.Height = d;elip.Width = d;elip.Stroke = stroke;elip.StrokeThickness = 1;Canvas.SetTop(elip, marge);Canvas.SetLeft(elip, marge);this.canvas.Children.Add(elip);

这里Stroke拥戴设置线的颜色,StrokeThickness设置线宽,Height 圆的高度,Width设置宽度,SetTop用来设置圆相对于画布的顶部距离,SetLeft用来设置圆相对于画布左边的距离, this.canvas.Children.Add(elip)用来把创建的控件添加到画布中.

但是我们今天要画的是一个带缺口的圆,那这个就不能满足要求了,那看第二步;

②画一个缺口圆:

var a1 = 95 * Math.PI / 180;var a2 = 445 * Math.PI / 180;var r = d / 2;double startX = r + Math.Cos(a1) * r;double startY = r + Math.Sin(a1) * r;double endX = r + Math.Cos(a2) * r;double endY = r + Math.Sin(a2) * r;bool largeArc = Math.Abs(a2 - a1) >= Math.PI;//角度之间的差异和PI比较bool sweep = (a1 < a2);//角度比较string path = String.Format(System.Globalization.CultureInfo.InvariantCulture,"M {0},{1} A {2},{3} 0 {4} {5} {6},{7}", startX, startY, r, r,largeArc ? 1 : 0, sweep ? 1 : 0, endX, endY);var pathe = uIElement as Path;var converter = TypeDescriptor.GetConverter(typeof(Geometry));pathe.Data = (Geometry)(converter.ConvertFrom(path));pathe.Stroke = Brushes.Black;//颜色pathe.StrokeThickness = 1;//线粗pathe.Width = d+20;pathe.Height = d+20;pathe.SetTop(marge);pathe.SetLeft(marge);this.canvas.Children.Add(pathe);

这里圆角度是顺时针的,和我示意图的角度反向正好相反,r是圆的半径,a1是起始弧度,a2是终止弧度,然后计算出来起止点和终止点以后,构建path,注意path是不可以直接给path.Data的,需要转化一下。这样缺口圆就画好了.

③绘制带箭头的线:

首先绘制直线:主要就是new一个实例,设置起始和终止点,线型线宽等

var line = uIElement as Line;line.X1 = p1.X;line.Y1 = p1.Y;line.X2 = p2.X;line.Y2 = p2.Y;line.Stroke = stroke;line.StrokeThickness = strokeThickness;this.canvas.Children.Add(line);

前头,主要也是计算起始和终止点:

public Point ArrowPosition(Point p1, Point p2, PositionType positionType){var headlen = 5;//箭头线的长度var theta = 45;//先头衔与直线的夹角,45°var angle = Math.Atan2(p1.Y - p2.Y, p1.X - p2.X) * 180 / Math.PI;double angle1 = 0;if (positionType == PositionType.StartPoint){angle1 = (angle + theta) * Math.PI / 180;}else{angle1 = (angle - theta) * Math.PI / 180;}var x = headlen * Math.Cos(angle1);var y = headlen * Math.Sin(angle1);var point = new Point(x, y);return point;}

④绘制字符串:

//绘制字符串lable = new Label();lable.Content = "270°";label.Foreground = stroke;label.SetTop(p2.Y - marge * 1.2);label.SetLeft(p2.X + marge * 1.5);this.canvas.Children.Add(label);

这里采用了标签的settop和setleft和① Canvas.SetTop\  Canvas.SetLeft意义一样.

⑤控件加载:

以上我们都把绘制好的控件添加到了canvas中,但是在VM中,canvas需要在界面加载时候获取一下:

protected override void OnViewAttached(object view, object context){base.OnViewAttached(view, context);var element = view as FrameworkElement;if (element == null){return;}canvas = element.FindName("canvas") as Canvas;}

这里是通过CM框架的 protected virtual void OnViewAttached(object view, object context);实现的

除此之外我们也可以在Canvas_Loaded事件中获取

public void Canvas_Loaded(object sender, RoutedEventArgs e){this.Canvas = sender as Canvas;}

前台需要绑定事件:

<Canvas x:Name="canvas" cal:Message.Attach="[Event Loaded] = [Action Canvas_Loaded($source,$eventArgs)]"/>

这里记得引用名称空间:

xmlns:cal="http://www.caliburnproject.org"

以上,如有疑问或者获取源码,请添加小编微信sf-1738658853,加入组织,请备注:进群!

C# WPF 用代码画一幅图(*精品*)相关推荐

  1. c语言逃跑的蠕虫函数,源码指标:穿越5线 第一时间吃鱼身 上行末端逃跑 没有未来函数 通达信幅图 精品公式...

    原标题:源码指标:穿越5线 第一时间吃鱼身 上行末端逃跑 没有未来函数 通达信幅图 精品公式 大盘技术周日发 7月新的:石盘铁蛋! 5线穿越副图:通达信源码 没有未来函数 使用说明:如果个股走强的特点 ...

  2. 下如何画出频率瀑布图_用maftools一行代码画出瀑布图

    昨天本科的一个师姐问我关于瀑布图的画法,想要画个瀑布图,问我有没有有什么工具可以画的,目标图如下 于是给师姐介绍了maftools这个R包,这个R包功能非常强大,可以做各种各样的图,今天就拿瀑布图为例 ...

  3. python怎么画两幅图_python matplotlib模块: Subplots(在同一个figure里绘制多个图)

    我们使用subplot可以实现在同一个figure对象下绘制多个图像:figure对象: image.png 每一个这样的图都包含唯一一个figure对象,而一个figure对象里面可以包含多个axe ...

  4. 用python代码画一幅星空

    运行代码后,会在画布上画出一些大小不同.位置随机的白色星星,就像是一幅星空一样.你可以根据自己的需求修改代码,调整画布大小.星星数量和大小等参数,让画出来的星空更加逼真. 效果如图所示 import ...

  5. PlantUML 用代码画思维导图,时序图,流程图

    PlantUML 是一个开源项目,支持通过脚本绘图.PlantUML 可以绘制如下种类的 UML 图: 时序图 用例图 类图 活动图 组件图 状态图 对象图 部署图 定时图 同时还支持以下非 UML ...

  6. jQuery选择器大全(48个代码片段+21幅图演示)

    转载收藏于:http://www.cnblogs.com/keepfool/archive/2012/06/02/2532203.html 选择器是jQuery最基础的东西,本文中列举的选择器基本上囊 ...

  7. python中用matplotlib画多幅图时出现图形部分重叠的解决方案

    1.解决方法:使用函数  tight_layout() 2.具体使用方法 import matplotlib.pyplot as pltfig = plt.figure()''' 具体的画图程序 '' ...

  8. 在origin 2018中同时画两个图,带errorbar和不带errorbar两种情况

    在origin 2018中同时画两个图,带errorbar和不带errorbar两种情况 在一个图层里同时画两幅图 两幅图坐标可不一致 ①在当前图层中,选中图层左上角的 1 标志 ②右键 1 →图层内 ...

  9. matplotlib画多个图并保存为PDF

    有时候需要用matplotlib画很多图,一个一个保存会产生很多文件.因此可以把多个图保存到一个PDF文件里面 import numpy as np import matplotlib.pyplot ...

最新文章

  1. cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)
  2. AD20使用中文菜单
  3. 纳米孔(Oxford Nanopore)测序仪的学习笔记
  4. 如何用Python从本地将一个文件备份到Google Drive
  5. having vs where
  6. SQLite shell操作
  7. 复制Linux虚拟机后的网卡问题解决
  8. 外网DNS系统外网访问及邮件系统外网域名访问问题
  9. C# 序列化技术详解《转》
  10. Windows Server 版本信息及支持期 Win10系统各版本服务起止日期。
  11. 2017河北对口计算机试题,2017河北省对口升学计算机专业理论试题(附答案解析).doc...
  12. php语言输出九九乘法表_PHP 输出九九乘法表
  13. 20200707:动态规划专题之不同路径
  14. 数据仓库与数据挖掘 5
  15. WAP 非443端口的ADFS如何配置Web应用程序代理
  16. liunx 操作系统的区别和之间的关系
  17. 两台电脑通过网线互联进行文件共享
  18. nginx 日志问题(\x22)
  19. HTML中的botton type=reset标签失效(不起作用)的可能原因。
  20. js网页进度条等待特效

热门文章

  1. 网络基础之IP地址分类及划分
  2. 8K×2K LED视频处理器,HDMI2.0,无缝切换
  3. linux foreach用法,mybatis foreach用法
  4. 基于场景的数据集究竟对深度学习落地有何影响(明厨亮灶,智慧工地,平安校园,电力,智慧交通),以yolox 训练检测为例
  5. ubuntu 虚拟终端登录 incorrect 无法输入密码
  6. 小样本学习下的Transformer:基于谱聚类层和标签代理学习
  7. springAOP面试题
  8. mtk 电池曲线_mtk 电池驱动流程详解
  9. 排列组合的一些公式及推导(非常详细易懂)
  10. 13、Swin Transformer: Hierarchical Vision Transformer using Shifted Windows