2018-7-15-WPF-在-DrawingContext-的-push-如何使用
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
WPF 在 DrawingContext 的 push 如何使用
|
lindexi
|
2018-7-15 15:51:0 +0800
|
2018-07-15 15:26:42 +0800
|
WPF
|
本文告诉大家如何使用 DrawingContext 变换,修改画出的内容。
如果在一个 DrawingContext 画出一个 DrawingVisual ,如何修改这个 DrawingVisual 的大小,对他进行变换?
简单的方法就是使用 PushTransform 方法,那么如何使用这个方法就是本文要告诉大家的。
先写一个简单的 OnRender ,创建一个类 GearcawralSarBule 继承 FrameworkElement 就可以重写 OnRender 方法,为了让WPF调用 OnRender 方法就需要把 GearcawralSarBule 加入视觉树,最简单加入视觉树的方法就是把他添加到 Grid,下面就是 GearcawralSarBule 类代码和在 xaml 添加他到 Grid 显示
public class GearcawralSarBule : FrameworkElement
{
/// <inheritdoc />
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
}
}
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<local:GearcawralSarBule></local:GearcawralSarBule>
</Grid>
现在运行可以看到界面没有内容,下面来使用一个已有的图片画出来。
public GearcawralSarBule()
{
DrawingVisual = new DrawingVisual();
using (var drawingContext = DrawingVisual.RenderOpen())
{
// 本来是想写文字 lindexi 的,但是最后还是画星
drawingContext.DrawGeometry(Brushes.Black, null, Geometry.Parse("m25,1 6,17h18l-14,11 5,17-15-10-15,10 5-17-14-11h18z"));
} DrawingVisual.CacheMode = new BitmapCache();
} private DrawingVisual DrawingVisual { get; set; }
上面代码使用 Geometry.Parse 转换一个图形,大家先猜一下是什么图形。
下面来把上面的 DrawingVisual 画出来
protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawDrawing(DrawingVisual.Drawing);
base.OnRender(drawingContext);
}
那么现在的问题是如何缩放这个画出来的 DrawingVisual ,实际上方法很简单,就是通过 drawingContext 的 push 方法。如果有玩过 ps 就知道,在 ps 有图层,使用 DrawingContext 的 push 方法就是创建一个图层,而且做的变换都是对这个图层做变换,在使用 push 创建图层之后需要使用 pop 把图层画进去。
如对 DrawingVisual 进行变换的代码
protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.PushTransform(new ScaleTransform()
{
ScaleX = 2,
ScaleY = 2,
});
drawingContext.DrawDrawing(DrawingVisual.Drawing);
drawingContext.Pop();
base.OnRender(drawingContext);
}
这时就可以对 DrawingVisual 放大,因为 Transform 可以进行移动、旋转,这里的代码就不告诉大家了
注意使用了 push 需要在画完使用 pop ,不然会出现下面继续对 DrawingVisual 进行画的时候就会发现还是在原先的图层
除了 PushTransform 方法还有很多 push 方法,如 PushClip ,调用这个方法可以裁剪传入的范围。如 PushOpacity 可以设置接下来画的图片的不透明度,如果多次调用 PushOpacity 没有调用 Pop 就会叠加不透明度,如使用下面代码
drawingContext.PushOpacity(0.3);
drawingContext.PushOpacity(0.3); drawingContext.DrawDrawing(DrawingVisual.Drawing);
和使用下面代码画出来的图形不透明度相同
drawingContext.PushOpacity(0.09);
drawingContext.DrawDrawing(DrawingVisual.Drawing);
还有一个 PushGuidelineSet 参见:WPF:基于物理像素的图形绘制 - Aaron Lu - 博客园
2018-7-15-WPF-在-DrawingContext-的-push-如何使用的更多相关文章
- WPF 使用鼠标拖动一个控件的实现[2018.7.15]
原文:WPF 使用鼠标拖动一个控件的实现[2018.7.15] Q:已经把一个Shape和一个TextBlock组合起来放到了一个Grid中,现在想要实现用鼠标拖动这个Grid到任意位置的功能,如何做 ...
- WPF 在绘图控件(Shape)中添加文字 [2018.7.15]
原文:WPF 在绘图控件(Shape)中添加文字 [2018.7.15] Q:使用Shape的子类Ellipse画一个圆,如何在圆中添加文字? A:Shape类中不包含Text属性.可使用Shape类 ...
- JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动
5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms ...
- 2018/8/15 qbxt 测试
2018/8/15 qbxt 测试 期望得分:100:实际得分:50 不知道为什么写挂了,明明是个水题 T^T 思路:模拟 注意:如果用 char 类型存储的话,如果有'z' + 9 会爆char ...
- Tencent Cloud Developers Conference(2018.12.15)
时间:2018.12.15地点:北京朝阳悠唐皇冠假日酒店
- Lean Data Innovation Sharing Salon(2018.09.15)
时间:2018.09.15地点:北京国华投资大厦
- 2018 年 -- 15 个有意思的 JavaScript 和 CSS 库
在Tutorialzine上你可以了解最新最酷的Web发展趋势.这就是为什么每个月都会发布一些偶然发现并认为值得你关注的最佳资源的缘由. Direction Reveal (方向展示) 该插件检测光标 ...
- 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)
传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...
- 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)
传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...
- 2018.09.15 vijos1053Easy sssp(最短路)
传送门 貌似可以最短路时同时判定负环啊. 但我不想这样做. 于是写了一个dfs版的判环,bfs版的求最短路. 代码: #include<iostream> #include<ccty ...
随机推荐
- 记录-VueJs中如何使用Teleport组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在DOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件 但是从整个页面应用的视图上看, ...
- 复现YOLO-of-RoboMaster-Keypoints-Detection-2023
开源仓库地址: https://github.com/zRzRzRzRzRzRzR/YOLO-of-RoboMaster-Keypoints-Detection-2023 该仓库提供了数据集,目前只是 ...
- 【已解决】解决Python打开文件---路径报错问题(SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape)
原因分析: 在windows系统当中读取文件路径可以使用\,但是在python字符串中\有转义的含义, 如\t可代表TAB,\n代表换行, 所以我们需要采取一些方式使得\不被解读为转义字符.目前有3个 ...
- https安全性 带给im 消息加密的启发
大家好,我是蓝胖子,在之前# MYSQL 是如何保证binlog 和redo log同时提交的?这篇文章里,我们可以从mysql的设计中学会如何让两个服务的调用逻辑达到最终一致性,这也是分布式事务实现 ...
- 携手HMS Core统一扫码服务, 兴业证券优理宝App提升用户扫码体验
兴业证券优理宝App联合华为HMS Core,集成HMS Core统一扫码服务,在提升扫码成功率的同时,还支持C端用户用手机端APP扫描手表端二维码,实现行情在手机与手表间跨终端流转,行情信息,抬腕可 ...
- 千字干货分享:一文教你ABI增强分析,BI的未来就在这里!
自2017年以来,智能概念开始出现,各类商业智能BI应用的使用门槛逐渐降低,商业智能BI制造商主要竞争增强分析的能力.<2020年Gartner分析与BI平台魔法象限报告>指出,2020年 ...
- Qt实现多图片合成PDF文件
需求:纯Qt,把多张图片合成到一个PDF文件中 // 合成PDF // include <QPdfWriter> QString pdfFileName = "D:\\a.pdf ...
- Windows系统自定义盘符图标
记录一个小知识: 自定义Windows系统盘符的图标,其实这个东西很简单,就像设置U盘的图标一样 首先准备一张ico图片,如果没有ico图片,只有jpg或其他格式的,可以使用这个在线转ico的网站,把 ...
- centos环境tomcat配置SSL
环境: centos7.9 tomcat9 jdk1.8 一.阿里云申请 免费SSL 按照官网的方法并未成功启动! 443 80端口加入安全组 阿里云申请免费ssl 下载后解压将localhost-r ...
- Unity-PC 端调用SpVoice语音 (文字转语音)
第一步引用文件 在VS当中 点击项目->添加引用-> 搜索Microsoft Speech Objecet Library 然后选中前面的白色方块点击确定就行了 插入之后 你的引用库中会多 ...