WPF实现XAML转图片的示例详解

 更新时间:2022年11月17日 15:47:18   作者:黑夜中的潜行者  
这篇文章主要为大家详细介绍了如何利用WPF实现XAML转图片,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下

背景

在实际开发过程中,会遇到需要编写各类打印模板模板的需求,当然这些在WPF开发中更为常见,但是使用XAML写编辑的打印模板又不能直接发送给打印机进行打印,这个时候就需要将我们编写好的模板导出为可打印的文件,为什么选择了图片呢,是因为在众多文件格式中图片是最易于保存的,这点不仅凸显在临时保存更重要的是长期保存,我们知道图片可以使用Base64字符串、Byte字节在数据库中进行长期保存,为后期读取带来极大的便利,即使模板更新了,也可以打印出很久以前的文件样式。

在写代码实现的时候也参考了很多人的实现,基本都是使用Canvas一类的控件标签来实现的,这样弊端就很凸显了,那就是必须先示例模板对象,才能够获取到模板的 Size 简单来说就是在不预览的情况下是不能转出图片的。

实现思路

这里稍加改变将 Element 改成 Control 这个时候我们的思路就是先获取当前Control实例的排版再更新布局,然后我们写一个方法用来检索显示预览所需的大小。然后声明一个 RenderTargetBitmap 对象并设置一些基础参数来接收内存中的位图。选择想要的图片转换对象,保存即可。

这里做了一些扩展,将常用的图片类型列了出来,以便满足不同需求。

代码实现

using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace XAMLToImage
{
    public class Conversion
    {
        public static void GenerateImage(Control control, string imageType, string path)
        {
            using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
            {
                GenerateImage(control, imageType, stream);

                stream.Flush();
                stream.Close();
            }
        }

        public static void GenerateImage(Control control, string imageType, Stream result)
        {
            if (control == null) return;

            control.InvalidateArrange();
            control.UpdateLayout();
            control.Background = Brushes.White;

            Size controlSize = RetrieveDesiredSize(control);
            Rect rect = new Rect(0, 0, controlSize.Width, controlSize.Height);
            RenderTargetBitmap bitmapRender = new RenderTargetBitmap((int)controlSize.Width, (int)controlSize.Height, 96, 96, PixelFormats.Pbgra32);

            control.Arrange(rect);
            bitmapRender.Render(control);

            BitmapEncoder encoder = null;
            //选取编码器
            switch (imageType.ToUpper())
            {
                case "BMP":
                    encoder = new BmpBitmapEncoder();
                    break;
                case "GIF":
                    encoder = new GifBitmapEncoder();
                    break;
                case "JPEG":
                    encoder = new JpegBitmapEncoder();
                    break;
                case "PNG":
                    encoder = new PngBitmapEncoder();
                    break;
                case "TIFF":
                    encoder = new TiffBitmapEncoder();
                    break;
                default:
                    break;
            }

            encoder.Frames.Add(BitmapFrame.Create(bitmapRender));
            encoder.Save(result);
        }

        private static Size RetrieveDesiredSize(Control control)
        {
            control.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            return control.DesiredSize;
        }
    }
}

可扩展

这里做一个小小的扩展,既然我们使用了Control作为模板,那么我们可以实现一个软件功能,就是将我们的模板统一使用XAML的Control来实现,然后导入我们的软件即可实现将设计好的模板、图形甚至是单界面原型将其导出。

到此这篇关于WPF实现XAML转图片的示例详解的文章就介绍到这了,更多相关WPF XAML转图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#判断字符编码的方法总结(六种方法)

    C#判断字符编码的方法总结(六种方法)

    这篇文章主要介绍了C#判断字符编码的方法,结合实例形式总结分析了六种C#判断字符编码的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#中winform实现自动触发鼠标、键盘事件的方法

    C#中winform实现自动触发鼠标、键盘事件的方法

    这篇文章主要介绍了C#中winform实现自动触发鼠标、键盘事件的方法,是C#程序设计中非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • C#用正则表达式Regex.Matches 方法检查字符串中重复出现的词

    C#用正则表达式Regex.Matches 方法检查字符串中重复出现的词

    使用正则表达式用Regex类的Matches方法,可以检查字符串中重复出现的词,Regex.Matches方法在输入字符串中搜索正则表达式的所有匹配项并返回所有匹配,本文给大家分享C#正则表达式检查重复出现的词,感兴趣的朋友一起看看吧
    2024-02-02
  • C#实现rar压缩与解压缩文件的方法

    C#实现rar压缩与解压缩文件的方法

    这篇文章主要介绍了C#实现rar压缩与解压缩文件的方法,实例分析了C#利用winrar程序实现文件的压缩与解压缩的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#创建线程带参数的方法

    C#创建线程带参数的方法

    本文给大家介绍C#创建线程带参数的方法,包括无参数线程的创建,带一个参数线程的创建及带两个及以上参数线程的创建,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • C#泛型的使用案例

    C#泛型的使用案例

    这篇文章介绍了C#泛型的使用案例,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • C# 线程简单介绍及使用详情

    C# 线程简单介绍及使用详情

    这篇文章主要介绍了C# 线程简单介绍及使用详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 如何使用C#扫描并读取图片中的文字

    如何使用C#扫描并读取图片中的文字

    本文介绍如何通过C# 程序来扫描并读取图片中的文字,这里以创建一个.Net Core程序为例。下面是具体步骤,供参考。有此需求的朋友可以了解下
    2021-06-06
  • 如何使用LinQ To Object把数组或DataTable中的数据进行向上汇总

    如何使用LinQ To Object把数组或DataTable中的数据进行向上汇总

    这篇文章主要介绍了如何使用LinQ To Object把数组或DataTable中的数据进行向上汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • WPF如何实现日期范围选择器

    WPF如何实现日期范围选择器

    这篇文章主要为大家详细介绍了WPF如何实现日期范围选择器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11

最新评论