You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:10:03