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); }