为什么此flowdocument表始终打印2列

时间:2010-03-01 21:13:09

标签: c# wpf printing flowdocument

我的WPF应用程序中有一个ListView,它绑定到要执行的任务集合(待办事项列表)。我希望用户能够打印他们的列表,并根据MSDN指南创建以下代码。 (这是我第一次涉足印刷)

public FlowDocument GetPrintDocument()
{
    FlowDocument flowDoc = new FlowDocument();
    Table table = new Table();

    int numColumns = 3;

    flowDoc.Blocks.Add(table);

    for(int x=0;x<numColumns;x++)
    {
        table.Columns.Add(new TableColumn());
    }
    GridLengthConverter glc = new GridLengthConverter();
    table.Columns[0].Width = (GridLength)glc.ConvertFromString("300");
    table.Columns[1].Width = (GridLength)glc.ConvertFromString("50");
    table.Columns[2].Width = (GridLength)glc.ConvertFromString("50");

    table.RowGroups.Add(new TableRowGroup());

    table.RowGroups[0].Rows.Add(new TableRow());
    // store current working row for reference
    TableRow currentRow = table.RowGroups[0].Rows[0];

    currentRow.FontSize = 16;
    currentRow.FontWeight = FontWeights.Bold;

    currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Subject"))));
    currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Due Date"))));
    currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Urgency"))));

    for (int i = 1; i < issues.Count+1; i++)
    {
        table.RowGroups[0].Rows.Add(new TableRow());
        currentRow = table.RowGroups[0].Rows[i];
        currentRow.FontSize = 12;
        currentRow.FontWeight = FontWeights.Normal;

        currentRow.Cells.Add(new TableCell
                            (new Paragraph
                            (new Run
                            (issues[i - 1].IssSubject))));
        currentRow.Cells.Add(new TableCell
                            (new Paragraph
                            (new Run
                            (issues[i - 1].IssDueDate.Date.ToString()))));
        currentRow.Cells.Add(new TableCell
                            (new Paragraph
                            (new Run
                            (issues[i - 1].IssUrgency.ToString()))));
    }
    return flowDoc;
} 

当我尝试使用以下代码进行打印时,我总是将页面拆分为中间的2列(每列包含表格的3列)。我尝试过不同的GridLength值但没有成功。

printDialog.PrintDocument(((IDocumentPaginatorSource)StatusBoardViewModel
               .GetPrintDocument())
               .DocumentPaginator 
            ,"Flow Document Print Job");

3 个答案:

答案 0 :(得分:20)

我想获得答案的最佳方法是放弃并询问,然后你自己找到答案。

问题在于打印页面,而不是flowdoc本身。默认情况下,它们打印2列。更正的代码是(这也涉及边距和可打印区域):

PrintDialog printDialog = new PrintDialog();

if (printDialog.ShowDialog() == true)
{

    FlowDocument flowDoc = statusBoardViewModel.GetPrintDocument();

    flowDoc.PageHeight = printDialog.PrintableAreaHeight;
    flowDoc.PageWidth = printDialog.PrintableAreaWidth;
    flowDoc.PagePadding = new Thickness(25);

    flowDoc.ColumnGap = 0;

    flowDoc.ColumnWidth = (flowDoc.PageWidth - 
                           flowDoc.ColumnGap - 
                           flowDoc.PagePadding.Left -  
                           flowDoc.PagePadding.Right);

    printDialog.PrintDocument(((IDocumentPaginatorSource)flowDoc)
                             .DocumentPaginator,
                             "Task Manager Print Job");

}

顺便提一下,我在Matthew MacDonald的“C#2008中的Pro WPF”中发现了这一点,我强烈推荐。

答案 1 :(得分:3)

感谢您的信息。我通过设置列宽来修复它:

flowDoc.ColumnWidth = pageSize.Width

我们永远不会尝试从netframeworkdev或.Net Framework Develop获得帮助b / c他们从来没有得到很好的答案。我希望我的搜索引擎会指向StackOverflow,而不是那个毫无价值的网站。 StackOverflow总是有答案。 :)再次感谢。

(希望你能阻止网站显示在你的搜索结果中,你知道该怎么做请告诉我。)

答案 2 :(得分:0)

Microsoft 文档是错误的/不完整的。

tl;dr:默认 ColumnWidth 解析为:320px(对于 FontSize 16px)

说明:

我也遇到了默认的“两列行为”。 我的流程文件:

  • PageWidth="8.5in"
  • ColumnWidth="NaN"(默认)

8.5 英寸页面宽度转换为(设备无关像素)PageWidth=816px

来自 MS 文档: "ColumnWidth=Auto" Causes column width to be automatically calculated to be 20 times the current FontSize.

默认字体大小为 16,因此:20 * 16px == 320px

所以肮脏的事实是。 NaN(默认值)表现为“自动”,对于 ColumnWidth="320px" 转换为 FontSize=16。这将导致页面宽度超过 640 像素的两列

  • 字母宽度:8.5 英寸 == 816 像素
  • A4 宽度:210 毫米 == 794 像素

当然,如果您的页面宽度超过 960 像素,还会有更多列。

MS 如何将物理长度转换为像素?

new System.Windows.LengthConverter().ConvertFromInvariantString("8.5in");
> 816d