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-如何使用的更多相关文章

  1. WPF 使用鼠标拖动一个控件的实现[2018.7.15]

    原文:WPF 使用鼠标拖动一个控件的实现[2018.7.15] Q:已经把一个Shape和一个TextBlock组合起来放到了一个Grid中,现在想要实现用鼠标拖动这个Grid到任意位置的功能,如何做 ...

  2. WPF 在绘图控件(Shape)中添加文字 [2018.7.15]

    原文:WPF 在绘图控件(Shape)中添加文字 [2018.7.15] Q:使用Shape的子类Ellipse画一个圆,如何在圆中添加文字? A:Shape类中不包含Text属性.可使用Shape类 ...

  3. 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  ...

  4. 2018/8/15 qbxt 测试

    2018/8/15 qbxt 测试 期望得分:100:实际得分:50   不知道为什么写挂了,明明是个水题 T^T 思路:模拟 注意:如果用 char 类型存储的话,如果有'z' + 9 会爆char ...

  5. Tencent Cloud Developers Conference(2018.12.15)

    时间:2018.12.15地点:北京朝阳悠唐皇冠假日酒店

  6. Lean Data Innovation Sharing Salon(2018.09.15)

    时间:2018.09.15地点:北京国华投资大厦

  7. 2018 年 -- 15 个有意思的 JavaScript 和 CSS 库

    在Tutorialzine上你可以了解最新最酷的Web发展趋势.这就是为什么每个月都会发布一些偶然发现并认为值得你关注的最佳资源的缘由. Direction Reveal (方向展示) 该插件检测光标 ...

  8. 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)

    传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...

  9. 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)

    传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...

  10. 2018.09.15 vijos1053Easy sssp(最短路)

    传送门 貌似可以最短路时同时判定负环啊. 但我不想这样做. 于是写了一个dfs版的判环,bfs版的求最短路. 代码: #include<iostream> #include<ccty ...

随机推荐

  1. Linux快速入门(三)Linux文件管理

    Linux文件操作 head head命令用于显示文件的前几行内容,可以通过-num参数展示文件前num行的内容. root@ubuntu:~# ls bb.txt cc.txt snap root@ ...

  2. 说说你对keep-alive的理解是什么?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.Keep-alive 是什么 keep-alive是vue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM ke ...

  3. 记录--极致舒适的Vue可编辑表格

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用ElementPlus的Table啥都好,就是没有可编辑表格!!! 既然UI库不支持,那我们实现一个可编辑表格是很难的事么?难么?不难 ...

  4. Orleans - 1 .NET生态构建分布式系统的利器

    在当今数字化时代,构建高效.可靠的分布式系统是许多企业和开发团队面临的挑战.微软的 Orleans 框架为解决这些挑战提供了一个强大而简单的解决方案.本文将介绍 Orleans 的核心概念,并通过一个 ...

  5. AI实用指南:5分钟搭建你自己的LLM聊天应用

    今天,我们将迅速着手搭建一个高效且富有创意的混元聊天应用,其核心理念可以用一个字来概括--快.在这个快节奏的时代,构建一个基础的LLM(Large Language Model,大型语言模型)聊天应用 ...

  6. Oracle 索引原理

    B-Tree索引 一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点. 可以用下图一来描述B树索引的结构.其中,B表示分支节点,而L表示叶子节点. 对于分支节点块(包括根节点块)来说,其所 ...

  7. mybatis调用Oracle存储过程 带游标

    存储过程 CREATE OR REPLACE PROCEDURE proc_test2(p_id IN NUMBER, v_cur OUT SYS_REFCURSOR, p_result_code O ...

  8. module的定义及端口的作用

    模型功能 module是verilog中层次划分的基本单元 通过module之间的调用,可以实现硬件描述层次的提高 端口列表则是module的输入输出,和数字电路的走线连接等效 基于module的不断 ...

  9. CSP:Object as Point同会议论文,相似思想用于人脸和行人检测 | CVPR 2019

    CSP将目标定义为中心点和尺寸,通过网络直接预测目标的中心和寸尺,相对于传统的RCNN类型检测算法轻量化了不少.整体思想与Object as Points撞车了,真是英雄所见略同   来源:晓飞的算法 ...

  10. java实战:多属性排序

    多属性排序的核心点就是对Arrays.sort()和Collections.sort()方法的Comparator进行重写 Arrays.sort()的三种用法 1.1.Arrays.sort(int ...