我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#怎么使用Win2D在UWP程序中实现2D绘图

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#怎么使用Win2D在UWP程序中实现2D绘图

这篇文章主要介绍“C#怎么使用Win2D在UWP程序中实现2D绘图”,在日常操作中,相信很多人在C#怎么使用Win2D在UWP程序中实现2D绘图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么使用Win2D在UWP程序中实现2D绘图”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

安装

Win2D并不是Win10 SDK里面的一部分,需要从Nuget上安装,在程序包管理器里直接安装Win2D.uwp即可。

PM> Install-Package Win2D.uwp

这个是Win10下的库,Win8下需要使用Win2D.win81库。安装完后在Project.json中可以看到相应的库依赖:

C#怎么使用Win2D在UWP程序中实现2D绘图

示例:

Win2D引入了一个新的画布:Microsoft.Graphics.Canvas.UI.Xaml.CanvasControl,所有的绘制必须在它上面进行。因此首先在XAML中添加CanvasControl作为底图:

    xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml"    <Grid>         <canvas:CanvasControl Draw="canvasControl_Draw" ClearColor="CornflowerBlue" />    </Grid>

然后响应其Draw事件,在里面添加绘制动作:

    void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)    {        args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);        args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow);    }

运行效果如下:

C#怎么使用Win2D在UWP程序中实现2D绘图

这种方式与WinForm和WPF中的自绘制比较像,只是一些API有些差异。

绘制API

前面使用了DrawingSesion下发绘制命令,和WPF中的DrawingContext差不多,就是一个绘制上下文。它主要的命令分为如下两种:DrawXXX和FillXXX。DrawXXX只是绘制图像,而FillXXX只填充图像,这里和WPF那种绘制和填充在一个API里的方式稍稍有点不同。

由于API并不多,这里列举了一下,基本上看着就知道怎么用了。

绘制图像

  • DrawCircle

  • DrawCachedGeometry

  • DrawEllipse

  • DrawGeometry

  • DrawImage

  • DrawInk

  • DrawLine

  • DrawRectangle

  • DrawRoundedRectangle

  • DrawText。

  • DrawTextLayout

填充图像

  • FillCircle

  • FillEllipse

  • FillGeometry

  • FillRectangle

  • FillRoundedRectangle

它的API还比较简单,基本上看着就知道怎么用,不过其中的DrawImage能传入一个IcanvasImage类型,而这个类型并不仅仅是图片,包括下面介绍的CanvasCommandList和Effect都是这种类型,使用的时候需要熟悉一下。

2D转换

2D绘图的过程中往往还伴随着一些平移,旋转等2D转换的操作,DrawingSession中提供了一个Transform属性可以传入一个3*2矩阵实现2D转换。

    var ds = args.DrawingSession;    ds.Transform = Matrix3x2.CreateTranslation(new Vector2(200, 100));    ds.DrawText("A", 0, 0, Colors.White);    ds.Transform *= Matrix3x2.CreateRotation(12, new Vector2(200,80));    ds.DrawText("B", 0, 0, Colors.White);

CanvasCommandList

CanvasCommandList可以缓存一组绘制命令,然后统一绘制。它可以用于分块绘制,也可以用于减少重复绘制。

    var renderTarget = new CanvasCommandList(sender);    using (var clds = renderTarget.CreateDrawingSession())    {        clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);        clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);    }    args.DrawingSession.DrawImage(renderTarget);

滤镜效果

Win2D的一个比较给力的特性就是支持滤镜特效,用它可以非常方便的实现常用的模糊、阴影等效果,这里以高斯模糊为例修改下上面的效果。

    var cmdList = new CanvasCommandList(sender);    using (var clds = cmdList.CreateDrawingSession())    {        clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);        clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);    }    var effect = new GaussianBlurEffect();    effect.Source = cmdList;    args.DrawingSession.DrawImage(effect);

系统还内置了许多常用的滤镜效果,它们都以Effect结尾,放在Microsoft.Graphics.Canvas.Effects名字空间下。

绘制事件

除了前面用到的绘制的时候触发绘制操作的Draw事件外,还有一个比较常用的事件CreateResource,它在最开始加载控件的时候触发,往往用于初始化各种资源。

另外再来看看Draw事件的触发条件,它基本上和WPF的OnRender差不多,也就是说,一般在初次加载时会触发,改变窗口大小的时候会触发,拖动窗口时不会触发。如果要在后台控制其重绘也比较简单,但用其Invalidate方法即可。

到此,关于“C#怎么使用Win2D在UWP程序中实现2D绘图”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#怎么使用Win2D在UWP程序中实现2D绘图

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#怎么使用Win2D在UWP程序中实现2D绘图

这篇文章主要介绍“C#怎么使用Win2D在UWP程序中实现2D绘图”,在日常操作中,相信很多人在C#怎么使用Win2D在UWP程序中实现2D绘图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么使用Win
2023-07-02

在Linux中怎么使用gdb调试C程序

这篇文章主要为大家展示了“在Linux中怎么使用gdb调试C程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Linux中怎么使用gdb调试C程序”这篇文章吧。无论多么有经验的程序员,开发的任
2023-06-16

怎么在微信小程序中使用SVG图标

这期内容当中小编将会给大家带来有关怎么在微信小程序中使用SVG图标,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先构造好DOM结构:
2023-06-07

怎么在java中使用Arrays实现排序

这篇文章给大家介绍怎么在java中使用Arrays实现排序,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布
2023-06-14

怎么在html5中使用canvas实现柱状图

这篇文章给大家介绍怎么在html5中使用canvas实现柱状图,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用方式首先我们看一下使用方式,参考了部分ECharts的使用方式,先传入要显示图表的html标签,接着调用i
2023-06-09

怎么在c#中使用Parallelx实现并行和多线程编程

本篇文章给大家分享的是有关怎么在c#中使用Parallelx实现并行和多线程编程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、 Parallel的使用1、Parallel.
2023-06-06

怎么在Html5中实现应用程序缓存

这篇文章给大家介绍怎么在Html5中实现应用程序缓存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、作用离线浏览 - 根据文件规则把资源缓存在本地,脱机依然能够访问资源,联网会直接使用缓存在本地的文件。优化加载速度,
2023-06-09

怎么在小程序中实现保存图片组件功能

这篇文章主要讲解了“怎么在小程序中实现保存图片组件功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在小程序中实现保存图片组件功能”吧!思路首先声明下组件采用的是uniapp,具体实现了
2023-06-25

怎么在Ubuntu系统中使用Unity更改程序图标

怎么在Ubuntu系统中使用Unity更改程序图标?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在Unity桌面环境,程序启动器实际上以.desktop为后缀的
2023-06-07

怎么在Android中使用RecyclerView实现一个图标拖拽排序功能

这期内容当中小编将会给大家带来有关怎么在Android中使用RecyclerView实现一个图标拖拽排序功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现的思路用两个RecyclerView实现,同时
2023-06-14

怎么在微信小程序中使用ECharts实现动态刷新

怎么在微信小程序中使用ECharts实现动态刷新?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。方法实例1.首先到ECharts官网下载它的例子,然后把ec-canvas文件
2023-06-14

怎么在Python中使用gevent实现协程

怎么在Python中使用gevent实现协程?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象
2023-06-14

怎么在Python中使用folium实现地图可视化

怎么在Python中使用folium实现地图可视化?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.安装folium模块pip install folium2.安装jupy
2023-06-15

怎么在Java中使用ReentrantReadWriteLock实现多线程

本篇文章给大家分享的是有关怎么在Java中使用ReentrantReadWriteLock实现多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java有哪些集合类Java中
2023-06-14

怎么在Android中使用ViewDragHelper实现一个拼图游戏

本篇文章给大家分享的是有关怎么在Android中使用ViewDragHelper实现一个拼图游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ViewDragHelper其实V
2023-05-30

怎么在Java中使用ReentrantLock实现并发编程

这篇文章给大家介绍怎么在Java中使用ReentrantLock实现并发编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、首先看图二、lock()跟踪源码这里对公平锁和非公平锁做了不同实现,由构造方法参数决定是否公
2023-06-15

怎么在Java中使用CountDownLatch实现并发编程

本篇文章为大家展示了怎么在Java中使用CountDownLatch实现并发编程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录