title author date CreateTime categories
WPF DrawingVisual
lindexi
2018-08-10 19:16:53 +0800
2018-2-13 17:23:3 +0800
WPF

本文:如何自定义控件用 DrawingVisual 画图

本文不会讲 DrawingVisual 是什么,只会告诉简单方法画图。

为何需要学这个?如果需要画出图形,对性能有要求,或者需要了解WPF如何画图,就需要知道这个。

先创建最简单使用,就是显示文字或显示点。

我觉得显示文字简单,于是开始写代码,先不要去想做什么,代码需要一个控件和一个画出文字的类。

首先新建一个控件,他是可以让 DrawingVisual 显示。

    public class MyVisualHost : FrameworkElement

这是很基础一个类,几乎没有什么功能。

于是新建一个 FrameworkElement 需要添加 一些方法,这是默认的,只需要自动创建就好。

这个类不是主要的,他是让DrawingVisual显示,在构造函数写下面的代码

这就是可以让 他可以显示。为何这样可以,参见:http://blog.csdn.net/changtianshuiyue/article/details/26981797

主要的类StrokeVisual,其实很简单,他可以在上面的类显示文字

        public class StrokeVisual : DrawingVisual

来看下他的方法

这样就可以画出文字。

需要在xaml添加下面代码,就可以显示出来

            <local:MyVisualHost></local:MyVisualHost>

为什么这样就可以画出?

那么如何做一个鼠标点下就画点的软件?

调用 RenderOpen 就可以打开一个 DrawingContext ,他提供很多方法,在他上面使用就可以画出,不过画出来看不到。需要添加到FrameworkElement才可以。

那么如何做出下图的程序?

首先对代码做修改,在 Windows 的MouseMove 调用 StrokeVisual 的 Add 方法和 画出来

需要获得鼠标的位置,获得方法很简单,在 MouseMove 函数写下面的代码,其中 e 就是参数

    p=e.GetPosition(this);

传入 StrokeVisual 调用他的 Draw 可以看到他画出来了

            _s.Add(new StylusPoint(p.X, p.Y));
_s.Draw();

那么需要看下添加的函数如何写,下面代码就是整个 StrokeVisual 的代码。

        public StrokeVisual()
{
Stroke = new Stroke(new StylusPointCollection(new Point[] { new Point(10, 10), }), new DrawingAttributes()
{
}); } public void Add(StylusPoint point)
{
Stroke.StylusPoints.Add(point);
} private Stroke Stroke;

那么如何从 Stroke 画出?

可以使用 Stroke 传入 dc 就可以画出来。

            using (var dc = RenderOpen())
{
Stroke.Draw(dc);
}

代码很简单,建议自己去写,我就不把代码给你。如果自己无法写,需要代码,那么联系我发代码给你。

2018-8-10-WPF-DrawingVisual的更多相关文章

  1. 申请Office 365一年免费的开发者账号攻略(2018年10月份版本)

    要进行Office 365开发,当然需要有完整的Office 365环境才可以.为了便于广大开发人员快速地启动这项工作,微软官方给所有开发人员提供了免费的一年开发者账号   那么如何申请Office ...

  2. IntelliJ IDEA 最新激活码(截止到2018年10月14日)

    IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYX ...

  3. 新手C#SQL Server使用记录2018.08.10

    主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...

  4. 01 mybatis框架整体概况(2018.7.10)-

    01 mybatis框架整体概况(2018.7.10)- F:\廖雪峰 JavaEE 企业级分布式高级架构师课程\廖雪峰JavaEE一期\第一课(2018.7.10) maven用的是3.39的版本 ...

  5. 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)

    目录 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛链接 竞赛题目 总结 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛 ...

  6. 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期

    三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...

  7. Burn Down Chart(2018.6.4~2018.6.10)

    Burn Down Chart (2018.6.4~2018.6.10) 娄雨禛[前端部分] 曾子轩[后端部分+燃尽图] 前端 1. 娄雨禛+李鑫 1)在总工程中完成跳转,实现图片显示,并发布到Git ...

  8. Java分布式互联网架构/微服务/高性能/springboot/springcloud 2018年10月17日直播内容

    2018年10月17日直播内容 大规模并发必备的消息中间件技术ActiveMq 网盘链接: https://pan.baidu.com/s/1GlxsZ2JnrvX- YN16-S7lQw 提取码: ...

  9. WPF DrawingVisual详解

    在WPF中,如果需要绘制大量图形元素,并且对性能要求严苛的话,最好使用DrawingVisual,当然,你也可以选用 Path类和比Path类更轻量级的Geometry(几何形状)来实现你的需求,但是 ...

  10. 【福州活动】| "福州首届.NET开源社区线下技术交流会"(2018.11.10)

    活动介绍 微软爱开源,已是尽人皆知的事实.自从收购全球最大的开源社区 GitHub 之后,微软依旧使 GitHub 保持独立运营,并且通过此项举措,微软本身已经成为最大的社区服务者. .NET Cor ...

随机推荐

  1. SQL数据库—<9>数据库安全

    --创建登陆用户 --create login login_name from windows with default_database = database | default_language ...

  2. js确认末尾字符算法挑战

    检查一个字符串(str)是否以指定的字符串(target)结尾. 如果是,返回true;如果不是,返回false. 这个挑战可以通过在ES2015中引入的.endsWith()方法来解决.但是出于这个 ...

  3. hibernate 参数一览

    实现包含了Hibernate与数据库的基本连接信息的配置方式有两种方式: 第一种是使用hibernate.properties文件作为配置文件. 第二种是使用hibernate.cfg.xml文件作为 ...

  4. Win32 API 多线程编程——一个简单实例(含消息参数传递)

    Win32 API进行程序设计具有很多优点:应用程序执行代码小,运行效率高,但是他要求程序员编写的代码较多,且需要管理所有系统提供给程序的资源,要求程序员对Windows系统内核有一定的了解,会占用程 ...

  5. (PASS)JAVA数组去重 三种方法 (不用集合)

    第一种方法(只学到数组的看): 定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0, package demo01; import java.sql.Array; import ...

  6. PHP随机生成不重复的8位卡号(数字)和卡密(字符串)

    一.生成不重复的随机数字,可自定义长度(最多支持10位数) /** * 生成不重复的随机数字(不能超过10位数,否则while循环陷入死循环) * @param int $start 需要生成的数字开 ...

  7. C语言——enum

    #include<stdio.h> enum Season { spring, summer=100, fall=96, winter }; typedef enum { Monday, ...

  8. 阿里云安装Cloudera Manager(草稿)

    选择三台同一局域网的阿里云服务器 最初使用阿里云.京东云.百度云的三台不同的服务器,遇到一些问题,没有解决,公网速度也没有保障,还是选择同一局域网的服务器吧 CM有三种不同的安装方式: 通过 Clou ...

  9. sql存储过程循环实现事务

    //往一张表中添加数据,获取添加数据生成的ID,再往另一张表中添加多条数据 ALTER PROCEDURE [dbo].[AttendanceCardAndDetail_Add] @SchoolID ...

  10. Tomcat内存问题解决办法

    使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap si ...