WPF实现可视化控件打印及打印预览
程序员文章站
2022-06-09 15:49:52
打印预览XAML代码:
view code
view code
打印预览xaml代码:
<controls:windowex x:class="suncreate.vipf.client.ui.mapprintpreview" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:controls="clr-namespace:suncreate.common.controls;assembly=suncreate.common.controls" mc:ignorable="d" d:designheight="700" d:designwidth="1000" loaded="windowex_loaded"> <window.resources> <resourcedictionary> <!-- 文字按钮 --> <style x:key="stltxtbtn" targettype="{x:type button}"> <setter property="template"> <setter.value> <controltemplate targettype="{x:type button}"> <border background="transparent"> <border x:name="bd" background="{templatebinding background}" cornerradius="2" padding="{templatebinding padding}"> <textblock x:name="txt" verticalalignment="center" horizontalalignment="center" margin="5 2 5 2" foreground="white" ><inlineuicontainer> <contentpresenter /> </inlineuicontainer></textblock> </border> </border> <controltemplate.triggers> <trigger property="ismouseover" value="true"> <setter targetname="bd" property="background" value="#33c4f5"/> </trigger> <trigger property="ispressed" value="true"> <setter targetname="txt" property="fontsize" value="11"/> </trigger> </controltemplate.triggers> </controltemplate> </setter.value> </setter> </style> </resourcedictionary> </window.resources> <grid> <grid.rowdefinitions> <rowdefinition height="38"></rowdefinition> <rowdefinition></rowdefinition> </grid.rowdefinitions> <border background="#f0f0f0"> <button x:name="btnprint" margin="10 0 0 0" background="#1aa4f5" width="60" height="28" horizontalalignment="left" fontsize="12" style="{staticresource stltxtbtn}" click="btnprint_click" content="打印"></button> </border> <border grid.row="1" background="#a0a0a0"> <scrollviewer horizontalscrollbarvisibility="auto" verticalscrollbarvisibility="auto"> <!-- 该border设置成固定a4纸大小 --> <border background="#fff" margin="10" width="842" height="595"> <!-- 该border可缩放至打印纸 --> <border x:name="border"> <image x:name="img" margin="10" stretch="uniform" source="{binding image}" horizontalalignment="left" verticalalignment="top" ></image> </border> </border> </scrollviewer> </border> </grid> </controls:windowex>
打印预览后台代码(注意:打印的是border不是image):
using suncreate.common.controls; using system; using system.collections.generic; using system.io; using system.linq; using system.printing; using system.text; using system.threading.tasks; 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; using system.windows.navigation; using system.windows.shapes; namespace suncreate.vipf.client.ui { /// <summary> /// 地图打印预览 /// </summary> public partial class mapprintpreview : windowex { /// <summary> /// 需要打印预览的控件 /// </summary> private frameworkelement _element; private bitmapimage _image; public bitmapimage image { get { return _image; } set { _image = value; onpropertychanged("image"); } } public mapprintpreview(frameworkelement element) { initializecomponent(); this.datacontext = this; _element = element; } private void windowex_loaded(object sender, routedeventargs e) { int width = (int)_element.actualwidth; int height = (int)_element.actualheight; rendertargetbitmap rendertargetbitmap = new rendertargetbitmap(width, height, 96, 96, pixelformats.pbgra32); rendertargetbitmap.render(_element); bmpbitmapencoder bmpbitmapencoder = new bmpbitmapencoder(); bmpbitmapencoder.frames.add(bitmapframe.create(rendertargetbitmap)); memorystream memorystream = new memorystream(); bmpbitmapencoder.save(memorystream); memorystream.position = 0; bitmapimage bitmapimage = new bitmapimage(); bitmapimage.begininit(); bitmapimage.streamsource = memorystream; bitmapimage.endinit(); image = bitmapimage; } private void btnprint_click(object sender, routedeventargs e) { printdialog printdialog = new printdialog(); printdialog.printticket.pageorientation = pageorientation.landscape; if (printdialog.showdialog() == true) { printdialog.printvisual(border, "打印地图"); } } } }
打印预览效果图(说明:地图没数据所以都是空白;地图下面空白,是因为地图尺寸长宽比例和a4纸比例不同,缩放到a4纸):
点击“打印”弹出系统的打印对话框。这个功能做的不是很理想,只是简单实现了预览与打印,没有达到我想要的效果。
上一篇: 全球首款屏下前摄游戏手机!一图看懂红魔7 UDC无孔全面屏
下一篇: 堆和栈的区别