• 在WPF中使用PrintDialog.PrintVisual方法进行打印


    1、概述

    使用PrintDialog. PrintVisual方法进行打印时,只需要提供WPF中的可视元素类型对象即可,比如UserControl或者Window。这种打印方法的好处是所见即所得,WPF会以图像的方式将其打印出来。此外,还可以通过数据绑定的方式进行动态数据打印。

    2、注意事项

    (1) 如果控件在没有显示的情况下打印,需要在内存中对其进行刷新。

    (2) 如果需要对其旋转,则需要设置控件的HorizontalAlignment和VerticalAlignment属性为左上角对齐,而且在刷新UI时将宽高对调,否则会出现打印不全的情况。

    (3) 对于控件中的数据绑定,如果显示有延迟,可以在打印之前对控件执行UpdateLayout操作。

    3、参考

    打印参数设置等思路可以参考:TSC TTP-244Pro标签打印机打印步骤小结

    4、代码示例 

    public void Print(UserControl userControl, bool rorate90, string printer, int copyCount)
    {
        //旋转
        if (rorate90)
        {
            var rotateTransform = new RotateTransform(90);
            userControl.LayoutTransform = rotateTransform;
        }
    
        //刷新UI
        var size = rorate90
            ? new Size(userControl.Width, userControl.Height)
            : new Size(userControl.Height, userControl.Width);
        userControl.Measure(size);
        userControl.Arrange(new Rect(new Point(0, 0), size));
    
        //设置对齐方式
        userControl.HorizontalAlignment = HorizontalAlignment.Left;
        userControl.VerticalAlignment = VerticalAlignment.Top;
    
        //更新布局
        userControl.UpdateLayout();
    
        //开始打印
        Print(userControl, printer, "test print", copyCount);
    }
    
    /// <summary>
    /// 打印
    /// </summary>
    /// <param name="userControl">要打印的控件</param>
    /// <param name="printer">打印机名称</param>
    /// <param name="description">打印描述</param>
    /// <param name="copyCount">打印个数</param>
    public static void Print(UserControl userControl, string printer, string description, int copyCount)
    {
        var localPrintServer = new LocalPrintServer();
        var printQueue = localPrintServer.GetPrintQueue(printer);
        if (printQueue.IsInError)
        {
            throw new Exception("打印机处于错误状态");
        }
    
        var printDialog = new PrintDialog
        {
            PrintQueue = printQueue, //打印队列
            PrintTicket = {CopyCount = copyCount} //打印个数
        };
    
        //设置纸张大小
        var pageWidth = (int) Math.Ceiling(printDialog.PrintableAreaWidth);
        var pageHeight = (int) Math.Ceiling(printDialog.PrintableAreaHeight);
        printDialog.PrintTicket.PageMediaSize = new PageMediaSize(pageWidth, pageHeight);
    
        //打印
        printDialog.PrintVisual(userControl, description);
    }
  • 相关阅读:
    MySQL server has gone away 问题的解决方法
    MySQL批量SQL插入性能优化
    mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    Mac OS使用ll、la、l等ls的别名命令
    Github上的PHP资源汇总大全
    svn代码版本管理总结
    mysql information_schema介绍
    redis 五种数据结构详解(string,list,set,zset,hash)
    git 换行符LF与CRLF转换问题
    php 利用activeMq+stomp实现消息队列
  • 原文地址:https://www.cnblogs.com/xhubobo/p/15165320.html
Copyright © 2020-2023  润新知