我们很多时候想把软件当前的界面内容保存为图片,在WPF中是非常简单的,RenderTargetBitmap就是专门用来干这个滴,鉴于很多朋友问我这个问题,我特此把相关的源代码在这里展示一下。

先看一下简单的XAML代码。里面只放置了一个按钮(点击按钮我们执行动作),一个图像控件(用来装我们的图片的。)

 

<Window x:Class="CaptureImage.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CaptureImage" Height="300" Width="300"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button x:Name="captureBtn" Content="capture" Click="CaptureBtn_Click"/>
<Image x:Name="img" Grid.Row="2"/>
</Grid>
</Window>

接下来在看一下后台代码,

 

/*
* Created by SharpDevelop.
* User: Franz
* Date: 2011-6-27
* Time: 22:24
*
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace CaptureImage
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}

void CaptureBtn_Click(object sender, RoutedEventArgs e)
{
this.img.Source = this.CreateElementScreenshot(this);
//this.img.Source = this.CreateElementScreenshot(new Button(){Content = "Hello"});
}

private BitmapSource CreateElementScreenshot(Visual visual) {

RenderTargetBitmap bmp = new RenderTargetBitmap((int)RenderSize.Width, (int)RenderSize.Height, 96, 96, PixelFormats.Default);
bmp.Render(visual);

return bmp;
}

private BitmapSource CreateNotRanderElementScreenshot(UIElement element)
{
var wantRanderSize = new Size(300, 300);
element.Measure(wantRanderSize);

element.Arrange(new Rect(new Point(0, 0), wantRanderSize));

return CreateElementScreenshot(element);
}

}
}

可以看到CaptureBtn_Click中有两行代码,我们先说未被注释掉的代码,很简单的调用了CreateElementScreenshot方法。可以看到当前软件界面被正确的呈现在图像控件内。

但是如果我们使用注释掉的代码来自己创建一个控件并把它显示出来。我们发现这样根本啥也不能够显示。原因其实很简单我们它并没有呈现在视觉树上,也就是说RenderTargetBitmap找不到一个合适的对象呈现来复制了。如果明天呈现那么我们就要手工的告诉它如何去呈现了。CreateNotRanderElementScreenshot方法假设了用300*300大小去呈现内容(我们可以根据自己的情况设定具体的值),通过Measure,Arrange方法告诉它要呈现多大。这样图片就被正确的显示出来了。

WPF将控件保存为图片相关推荐

  1. wpf image控件循环显示图片 以达到动画效果 问题及解决方案

    1>最初方案: 用wpf的image控件循环显示图片,达到动画效果,其实就是在后台代码动态改变Image.Source的值,关键代码: for (int i = 1; i < 601; i ...

  2. WPF的控件Binding笔记

    WPF的控件Binding笔记 1 绑定一个普通的属性 在类中定义了一个自定义的 content属性(非依赖项属性),在xaml的button的content属性中绑定它. Content=" ...

  3. WPF Image控件鼠标双击事件的实现

    WPF Image控件鼠标双击事件的实现 1.绑定Image控件的OnMouseDown事件 <Image x:Name="Image" Margin="0&quo ...

  4. C# WPF 歌词控件(支持逐字定位描色效果)

    C# WPF 歌词控件(支持逐字定位描色效果) 原文:C# WPF 歌词控件(支持逐字定位描色效果) 之前做了一个模仿网易云歌词的控件,实现了加载网易云歌词并能随音乐播放进度定位歌词.今天呢将在这个控 ...

  5. java多文件上传plupload控件实现多图片上传(二)

    接上篇 java多文件上传plupload控件实现多图片上传(一) 续写PluploadUtil 和 Plupload PO类,以及后台的action. 至此,可实现多文件上传功能. 上传文件Acti ...

  6. WPF第三方控件盘点

    WPF统一的编程模型.语言和框架,实现了界面设计人员和开发人员工作可以分离的境界,鉴于WPF强大的优势,且一直是开发者关注的地方,下面和大家分享基于WPF项目开发需要用到的第三方控件,包括业界最受好评 ...

  7. WPF 用户控件分享之边上带输入框的圆圈

    WPF 用户控件分享之边上带输入框的圆圈 独立观察员 2022 年 8 月 20 日 最近有这样一个需求,有一圈圆形,每个圆形边上有个输入框,以下是完成后的效果图: 拿到这个需求后,分析界面上每个圆形 ...

  8. oc中在控件上显示图片

    当我们想在控件上改变图片的时候,我们需要做的是获得图片的引用,然后调用函数,来设置图片.那么具体是怎样来操作. 第一步是获得控件的引用: @property(weak,nonatomic)IBOutl ...

  9. wpf项目源代码_C# WPF开源控件库:MahApps.Metro

    C# WPF开源控件库:MahApps.Metro ❝ 其实站长很久之前就知道这个开源WPF控件库了,只是一直欣赏不了这种风格,但也star了该项目.每次浏览该仓库时,发现star越来越多,也看到很多 ...

最新文章

  1. 雅虎因性别歧视成被告 不过这次遭歧视的是男性
  2. android 简易定时器
  3. 轻量级的网页Rank算法,365Rss.cn的Rank技术解释以及算法讨论(一)
  4. android开发日历库,Android SDK开发范例大全--5.5自制日历手机数据库笔记
  5. < meta name=“viewport“ content=“width=device-width, initial-scale=1.0“>的解释
  6. Tp框架中模板中if条件如何使用?
  7. 把关与服务的关系_泉州代做投标书-电子标书值得信赖 - 泉州广告服务
  8. Spring : Spring 事务控制 设置手动回滚 TransactionAspectSupport
  9. 笔记本vm系统的分辨率不好调整_苹果笔记本电脑怎么设置使用今声优盒
  10. sf | 空间矢量对象的属性连接方法
  11. 硬盘服务器作用,文件服务器有什么作用?
  12. kindle看pdf乱码_Kindle 中文书名 目录 乱码 解决办法
  13. 【图形学】计算网格中两点连成的直线所经过的格子
  14. 在用docker部署nginx时,出现curl: (6) Could not resolve host: localhsot; 未知的错误
  15. Vue 点击事件写法
  16. 扭转二战战局的密码系统 | 历史上的今天
  17. 理解事务四大特性(Transaction)——原子性、一致性、隔离性和持久性(ACID)
  18. Linux入门——1、Linux的安装(Ubuntu)
  19. ROS的代价地图与AMCL定位原理
  20. tensorflow 冻结梯度

热门文章

  1. stm32 DMA转运ADC多通道
  2. 网络职业成长规划经验谈
  3. win10 + Ubuntu 20.04 LTS 双系统安装 (UEFI + GPT)(图文,多图预警)
  4. 文献阅读笔记:Unsupervised Machine Translation Using Monolingual Corpora Only
  5. 语音输入是计算机在哪个领域的应用,人工智能语音识别支持9种语言
  6. shiro 权限框架
  7. QQ(微信)一次性发送多条信息(连续发520遍我爱你)
  8. 【C语言】C语言的简介
  9. 【100%通过率】华为OD机试真题 C++ 实现【简单的自动曝光】【2022.11 Q4 新题】
  10. Maven之(四)Maven命令