最近需要用到这个功能,搜了一下不少代码有问题 ,找到一个效果比较好的,支持多级子元素 记一下.

  1. private void button_save_window_Click(object sender, RoutedEventArgs e)
  2. {
  3.  
  4. util.SaveWindow(this,,"d:\\window.png");
  5. }
  6.  
  7. private void button_save_canvas_Click(object sender, RoutedEventArgs e)
  8. {
  9.  
  10. util.SaveCanvas(this,this.canvas1, , "d:\\canvas.png");
  11. }
  12. }
  13.  
  14. public static class util
  15. {
  16. public static void SaveWindow(Window window, int dpi, string filename)
  17. {
  18.  
  19. var rtb = new RenderTargetBitmap(
  20. (int)window.Width, //width
  21. (int)window.Width, //height
  22. dpi, //dpi x
  23. dpi, //dpi y
  24. PixelFormats.Pbgra32 // pixelformat
  25. );
  26. rtb.Render(window);
  27.  
  28. SaveRTBAsPNG(rtb, filename);
  29.  
  30. }
  31.  
  32. public static void SaveCanvas(Window window, Canvas canvas, int dpi, string filename)
  33. {
  34. Size size = new Size(window.Width , window.Height );
  35. canvas.Measure(size);
  36. //canvas.Arrange(new Rect(size));
  37.  
  38. var rtb = new RenderTargetBitmap(
  39. (int)window.Width, //width
  40. (int)window.Height, //height
  41. dpi, //dpi x
  42. dpi, //dpi y
  43. PixelFormats.Pbgra32 // pixelformat
  44. );
  45. rtb.Render(canvas);
  46.  
  47. SaveRTBAsPNG(rtb, filename);
  48. }
  49.  
  50. private static void SaveRTBAsPNG(RenderTargetBitmap bmp, string filename)
  51. {
  52. var enc = new System.Windows.Media.Imaging.PngBitmapEncoder();
  53. enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bmp));
  54.  
  55. using (var stm = System.IO.File.Create(filename))
  56. {
  57. enc.Save(stm);
  58. }
  59. }

原文链接

WPF 中保存 window(窗口)或者canvas成图片的更多相关文章

  1. 如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

    原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被 ...

  2. (转载)JavaScript中的Window窗口对象

    (转载)http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 例子: <html> <head> < ...

  3. 【.net 深呼吸】WPF 中的父子窗口

    与 WinForm 不同,WPF 并没有 MDI 窗口,但 WPF 的窗口之间是可以存在“父子”关系的. 我们会发现,Window 类公开了一个属性叫 Owner,这个属性是可读可写的,从名字上我们也 ...

  4. WPF中实现登陆窗口的“记住帐号”功能

    1.在Login.xaml中添加资源: <XmlDataProvider x:Key="XmlDataProvider" Source="pack://applic ...

  5. WPF中两个窗口的互斥

    这里所讲的互斥是两个窗口不同时存在,打开一,只显示一:点一相关按钮显示二,关闭一:关闭二,显示一. 窗口一: history winResult winChoice = new winResult() ...

  6. C# 在winform或者wpf中显示控制台窗口

    这儿需要使用两个系统函数: BOOL WINAPI FreeConsole(void); //// 关闭控制台窗口,参考:http://msdn.microsoft.com/en-us/library ...

  7. 解决WPF中重载Window.OnRender函数失效问题

    今天实验一个绘图算法的时候,偶然发现重载Window.OnRender的方法是没有效果的. public partial class MainWindow : Window { public Main ...

  8. OpenGL中的深度、深度缓存、深度测试及保存成图片

    1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就 ...

  9. WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

    首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼 ...

随机推荐

  1. Effective Objective-C 2.0 学习记录

    由于最近入职,公司安排自由学习,于是有时间将Effective Objective-C 2.0一书学习了一遍.由于个人知识面较窄,对于书中有些内容无法理解透彻,现将所学所理解内容做一遍梳理,将个人认为 ...

  2. python 中的[::-1]

    for value in rang(10)涉及的数字倒序输出: for value in rang(10)[::-1]涉及的数字倒序输出: 一.反转 二.详解 这个是python的slice nota ...

  3. redis 数据导出

    一.导出所有的keys echo "keys 201*" |./redis-cli -h localhost -p 6379 -a password >> 1.txt ...

  4. 高级智能研究计划(IARPA):大脑皮层建模

    哈哈,看到了一篇我最感兴趣的领域的新闻报导,可以深挖里面的各种细节. Quanta Magazine: Illuminating Science - 原文出处 卡内基·梅隆大学 - Tai Sing ...

  5. laravel 表单验证 正则匹配

    判断url地址 是否为正确格式 控制器中 $this -> validate($request,[ 'linkname' => 'required|max:6|min:2', 'url' ...

  6. 图片延迟加载(用jq自己写的方法)

    $(function() { $("img.lazy").attr("src","2.jpg"); show(); $(window).sc ...

  7. OpenBSD为何还在用CVS之感

    一个轻松无聊的晚上突然想到一个问题——在当今这个Git大红大紫的时代,OpenBSD为何还在用CVS代码仓库?连他同阵营的FreeBSD都已经改用SVN,宣布逐渐废掉CVS了……问了下google,搜 ...

  8. BZOJ1996 [Hnoi2010]chorus 合唱队

    很容易想到区间DP 然后发现这个区间只和圆序列的最后一个数有关,而原序列的最后一个数只可能是现在区间的头或者尾 令$f[i][j][0/1]$表示在区间$[i, j]$之间,原序列的最后一个数是当前区 ...

  9. ES6 基础版迭代器

    ES6中引入了generator function* get() { var result1 = yield c; var result2 = yield b; var result3 = yield ...

  10. 使用rpm命令卸载程序

    步骤1.rpm -qa|grep 程序名称 步骤2.rpm -e 安装包名称 --nodeps