WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片的示例詳解
背景
在實(shí)際開發(fā)過程中,會遇到需要編寫各類打印模板模板的需求,當(dāng)然這些在WPF開發(fā)中更為常見,但是使用XAML寫編輯的打印模板又不能直接發(fā)送給打印機(jī)進(jìn)行打印,這個(gè)時(shí)候就需要將我們編寫好的模板導(dǎo)出為可打印的文件,為什么選擇了圖片呢,是因?yàn)樵诒姸辔募袷街袌D片是最易于保存的,這點(diǎn)不僅凸顯在臨時(shí)保存更重要的是長期保存,我們知道圖片可以使用Base64字符串、Byte字節(jié)在數(shù)據(jù)庫中進(jìn)行長期保存,為后期讀取帶來極大的便利,即使模板更新了,也可以打印出很久以前的文件樣式。
在寫代碼實(shí)現(xiàn)的時(shí)候也參考了很多人的實(shí)現(xiàn),基本都是使用Canvas一類的控件標(biāo)簽來實(shí)現(xiàn)的,這樣弊端就很凸顯了,那就是必須先示例模板對象,才能夠獲取到模板的 Size 簡單來說就是在不預(yù)覽的情況下是不能轉(zhuǎn)出圖片的。
實(shí)現(xiàn)思路
這里稍加改變將 Element 改成 Control 這個(gè)時(shí)候我們的思路就是先獲取當(dāng)前Control實(shí)例的排版再更新布局,然后我們寫一個(gè)方法用來檢索顯示預(yù)覽所需的大小。然后聲明一個(gè) RenderTargetBitmap 對象并設(shè)置一些基礎(chǔ)參數(shù)來接收內(nèi)存中的位圖。選擇想要的圖片轉(zhuǎn)換對象,保存即可。
這里做了一些擴(kuò)展,將常用的圖片類型列了出來,以便滿足不同需求。
代碼實(shí)現(xiàn)
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;
}
}
}
可擴(kuò)展
這里做一個(gè)小小的擴(kuò)展,既然我們使用了Control作為模板,那么我們可以實(shí)現(xiàn)一個(gè)軟件功能,就是將我們的模板統(tǒng)一使用XAML的Control來實(shí)現(xiàn),然后導(dǎo)入我們的軟件即可實(shí)現(xiàn)將設(shè)計(jì)好的模板、圖形甚至是單界面原型將其導(dǎo)出。

到此這篇關(guān)于WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片的示例詳解的文章就介紹到這了,更多相關(guān)WPF XAML轉(zhuǎn)圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中winform實(shí)現(xiàn)自動觸發(fā)鼠標(biāo)、鍵盤事件的方法
這篇文章主要介紹了C#中winform實(shí)現(xiàn)自動觸發(fā)鼠標(biāo)、鍵盤事件的方法,是C#程序設(shè)計(jì)中非常實(shí)用的功能,需要的朋友可以參考下2014-08-08
C#用正則表達(dá)式Regex.Matches 方法檢查字符串中重復(fù)出現(xiàn)的詞
使用正則表達(dá)式用Regex類的Matches方法,可以檢查字符串中重復(fù)出現(xiàn)的詞,Regex.Matches方法在輸入字符串中搜索正則表達(dá)式的所有匹配項(xiàng)并返回所有匹配,本文給大家分享C#正則表達(dá)式檢查重復(fù)出現(xiàn)的詞,感興趣的朋友一起看看吧2024-02-02
如何使用LinQ To Object把數(shù)組或DataTable中的數(shù)據(jù)進(jìn)行向上匯總
這篇文章主要介紹了如何使用LinQ To Object把數(shù)組或DataTable中的數(shù)據(jù)進(jìn)行向上匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

