日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

WPF實現XAML轉圖片的示例詳解_C#教程

作者:黑夜中的潛行者 ? 更新時間: 2022-12-14 編程語言

背景

在實際開發過程中,會遇到需要編寫各類打印模板模板的需求,當然這些在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來實現,然后導入我們的軟件即可實現將設計好的模板、圖形甚至是單界面原型將其導出。

原文鏈接:https://blog.csdn.net/qq_43562262/article/details/126417902

欄目分類
最近更新