使用PrintDialog打印的WPF文档为何分成两列?
WPF FlowDocument打印问题修复方案
针对你遇到的三个打印问题,逐一给出解决办法:
1. 表格列宽未按内容自适应
当前设置GridLength.Auto未生效,是因为FlowDocument的Table默认不会自动计算内容宽度。可以在生成表格内容后,遍历单元格计算每列最大宽度,手动设置列宽:
// 表格内容生成完成后执行 foreach (var column in tbl_Actieverelevant_objects.Columns) { double maxWidth = 0; foreach (TableRow row in tbl_Actieverelevant_objects.RowGroups[0].Rows) { var cell = row.Cells[tbl_Actieverelevant_objects.Columns.IndexOf(column)]; cell.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); maxWidth = Math.Max(maxWidth, cell.DesiredSize.Width); } column.Width = new GridLength(maxWidth); }
2. 表格网格线不可见
通过设置表格单元格间距和边框样式解决:
// 创建表格时配置 tbl_Actieverelevant_objects.CellSpacing = 0; // 统一设置单元格边框样式 Style cellStyle = new Style(typeof(TableCell)); cellStyle.Setters.Add(new Setter(BorderThicknessProperty, new Thickness(1))); cellStyle.Setters.Add(new Setter(BorderBrushProperty, Brushes.Black)); tbl_Actieverelevant_objects.CellStyle = cellStyle;
3. 强制多栏打印(关键问题)
该问题由FlowDocument默认的自动分栏布局导致,通过以下代码强制单栏:
// 创建FlowDocument后添加 doc.ColumnWidth = Double.NaN; // 禁用自动分栏 // 匹配打印机可用打印区域尺寸 doc.PageWidth = printDialog.PrintableAreaWidth; doc.PageHeight = printDialog.PrintableAreaHeight;
修改后的完整代码片段
if (printDialog.ShowDialog() == true) { FlowDocument doc = new FlowDocument(new Paragraph(new Run($"打印文档 ({DateTime.Now.ToString("F")})"))); doc.Name = "FlowDoc"; doc.PagePadding = new Thickness(40); // 解决多栏打印问题 doc.ColumnWidth = Double.NaN; doc.PageWidth = printDialog.PrintableAreaWidth; doc.PageHeight = printDialog.PrintableAreaHeight; Paragraph par_ActieveMatrijsPalletten = new Paragraph(new Run("活跃对象章节")); Paragraph par_Geplanderelevant_objects = new Paragraph(new Run("计划对象章节")); // 处理第一个表格 System.Windows.Documents.Table tbl_Actieverelevant_objects = new Table(); tbl_Actieverelevant_objects.CellSpacing = 0; // 设置单元格边框样式 Style cellStyle = new Style(typeof(TableCell)); cellStyle.Setters.Add(new Setter(BorderThicknessProperty, new Thickness(1))); cellStyle.Setters.Add(new Setter(BorderBrushProperty, Brushes.Black)); tbl_Actieverelevant_objects.CellStyle = cellStyle; tbl_Actieverelevant_objects.Columns.Add(new TableColumn() { Name = "Field1", Width = GridLength.Auto }); // ... 添加其他列 tbl_Actieverelevant_objects.RowGroups.Add(new TableRowGroup()); foreach (var element in Activerelevant_objects) { TableRow currentRow = new TableRow(); currentRow.Cells.Add(new TableCell(new Paragraph(new Run(element.Field1.ToString())))); // ... 添加其他单元格 tbl_Actieverelevant_objects.RowGroups[0].Rows.Add(currentRow); } // 计算并设置列宽 foreach (var column in tbl_Actieverelevant_objects.Columns) { double maxWidth = 0; foreach (TableRow row in tbl_Actieverelevant_objects.RowGroups[0].Rows) { var cell = row.Cells[tbl_Actieverelevant_objects.Columns.IndexOf(column)]; cell.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); maxWidth = Math.Max(maxWidth, cell.DesiredSize.Width); } column.Width = new GridLength(maxWidth); } // 第二个表格按相同逻辑处理... doc.Blocks.Add(par_ActieveMatrijsPalletten); doc.Blocks.Add(tbl_Actieverelevant_objects); doc.Blocks.Add(new Paragraph(new Run("文档结束"))); DocumentPaginator paginator = ((IDocumentPaginatorSource)doc).DocumentPaginator; printDialog.PrintDocument(paginator, "打印文档"); }
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

