在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); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器