欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF实现可视化控件打印及打印预览

程序员文章站 2022-06-09 15:49:52
打印预览XAML代码:

打印预览xaml代码:

WPF实现可视化控件打印及打印预览
<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>
view code

打印预览后台代码(注意:打印的是border不是image):

WPF实现可视化控件打印及打印预览
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, "打印地图");
            }
        }

    }
}
view code

打印预览效果图(说明:地图没数据所以都是空白;地图下面空白,是因为地图尺寸长宽比例和a4纸比例不同,缩放到a4纸):

WPF实现可视化控件打印及打印预览

 

点击“打印”弹出系统的打印对话框。这个功能做的不是很理想,只是简单实现了预览与打印,没有达到我想要的效果。