WPF實現(xiàn)XAML轉(zhuǎn)圖片的示例詳解
背景
在實際開發(fā)過程中,會遇到需要編寫各類打印模板模板的需求,當(dāng)然這些在WPF開發(fā)中更為常見,但是使用XAML寫編輯的打印模板又不能直接發(fā)送給打印機(jī)進(jìn)行打印,這個時候就需要將我們編寫好的模板導(dǎo)出為可打印的文件,為什么選擇了圖片呢,是因為在眾多文件格式中圖片是最易于保存的,這點不僅凸顯在臨時保存更重要的是長期保存,我們知道圖片可以使用Base64字符串、Byte字節(jié)在數(shù)據(jù)庫中進(jìn)行長期保存,為后期讀取帶來極大的便利,即使模板更新了,也可以打印出很久以前的文件樣式。
在寫代碼實現(xiàn)的時候也參考了很多人的實現(xiàn),基本都是使用Canvas一類的控件標(biāo)簽來實現(xiàn)的,這樣弊端就很凸顯了,那就是必須先示例模板對象,才能夠獲取到模板的 Size 簡單來說就是在不預(yù)覽的情況下是不能轉(zhuǎn)出圖片的。
實現(xiàn)思路
這里稍加改變將 Element 改成 Control 這個時候我們的思路就是先獲取當(dāng)前Control實例的排版再更新布局,然后我們寫一個方法用來檢索顯示預(yù)覽所需的大小。然后聲明一個 RenderTargetBitmap 對象并設(shè)置一些基礎(chǔ)參數(shù)來接收內(nèi)存中的位圖。選擇想要的圖片轉(zhuǎn)換對象,保存即可。
這里做了一些擴(kuò)展,將常用的圖片類型列了出來,以便滿足不同需求。
代碼實現(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ò)展
這里做一個小小的擴(kuò)展,既然我們使用了Control作為模板,那么我們可以實現(xiàn)一個軟件功能,就是將我們的模板統(tǒng)一使用XAML的Control來實現(xiàn),然后導(dǎo)入我們的軟件即可實現(xiàn)將設(shè)計好的模板、圖形甚至是單界面原型將其導(dǎo)出。
到此這篇關(guān)于WPF實現(xiàn)XAML轉(zhuǎn)圖片的示例詳解的文章就介紹到這了,更多相關(guān)WPF XAML轉(zhuǎn)圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#在Windows窗體控件實現(xiàn)內(nèi)容拖放(DragDrop)功能
這篇文章介紹了C#在Windows窗體控件實現(xiàn)內(nèi)容拖放(DragDrop)的功能,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05HttpWebRequest出錯.Section=ResponseHeader Detail=CR
HttpWebRequest出錯.Section=ResponseHeader Detail=CR...2007-03-03C#實現(xiàn)獲取多維數(shù)組的行數(shù)與列數(shù)
這篇文章主要為大家詳細(xì)介紹了C#如何分別使用Array.GetUpperBound方法和Array.GetLength方法實現(xiàn)獲取多維數(shù)組的行數(shù)與列數(shù),需要的可以參考下2024-02-02c# winform treelistview的使用(treegridview)實例詳解
這篇文章主要介紹了c# winform treelistview的使用(treegridview),本文通過實例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2017-12-12C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實例
本文主要分享了C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實例代碼。具有很好的參考價值,需要的朋友可以看下2016-12-12