【问题标题】:WPF Flow Document LayoutWPF 流文档布局
【发布时间】:2012-07-16 19:09:05
【问题描述】:

我正在尝试打印 WPF FlowDocument。版面需要采用每页4个文档的形式,布局如下:

 Doc1 | Doc2
-------------
 Doc3 | Doc4

(抱歉,我想不出更好的方式来说明布局)。

页面需要填满,所以如果Doc1&2是空白或者只有一两个字符,它仍然需要打印和Doc3&4一样的大小。

我正在使用的代码如下(对不起,它很长,我已尝试在可行的情况下进行删节):

PrintDialog printDialog = new PrintDialog();
if ((bool)printDialog.ShowDialog().GetValueOrDefault())
{
    FlowDocument flowDocument = new FlowDocument();
    flowDocument.PageHeight = printDialog.PrintableAreaHeight;
    flowDocument.PageWidth = printDialog.PrintableAreaWidth;
    flowDocument.PagePadding = new Thickness(25);

    flowDocument.ColumnGap = 0;

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


    Table myTable = new Table();
    myTable.BorderThickness = new Thickness(3);

    AddCols(myTable);         // Add 2 cols

    TableRowGroup rg = new TableRowGroup();
    TableRow row = new TableRow();

    AddRows(myTable);         // Adds 2 rows

    TableCell cell = new TableCell(new Paragraph(new Run("Doc1")));                
    cell.BorderThickness = new Thickness(1);
    cell.BorderBrush = Brushes.Black;          
    // Repeat 4 times      

    row.Cells.Add(cell);

    myTable.RowGroups.Add(rg);

    doc.Blocks.Add(myTable);

    ....

我遇到的问题是,尽管确实可以打印,但它并没有尝试将其放入上述页面。我正在尝试的方法是否可行?如果可以,如何实现?

编辑:

here看,我相信我真正需要的是一种计算段落高度的方法,这样我就可以设置Padding属性。不幸的是,此链接中提出的解决方案不起作用!

【问题讨论】:

    标签: c# .net wpf printing flowdocument


    【解决方案1】:

    尝试将整个块放在一个网格中,以使其具有统一的布局,然后将网格放在块中,然后将块放在单个表格单元格中。看看这是否适合你 -

    Grid grid = new Grid();
            grid.RowDefinitions.Add(new RowDefinition());
            grid.RowDefinitions.Add(new RowDefinition());
            grid.ColumnDefinitions.Add(new ColumnDefinition());
            grid.ColumnDefinitions.Add(new ColumnDefinition());
    
            Label text1 = new Label();
            text1.Content = "Doc1";
            grid.Children.Add(text1);
            Grid.SetColumn(text1, 0);
            Grid.SetRow(text1, 0);
    
            Label text2 = new Label();
            text1.Content = "Doc2";
            grid.Children.Add(text2);
            Grid.SetColumn(text2, 1);
            Grid.SetRow(text2, 0);
    
            Label text3 = new Label();
            text1.Content = "Doc3";
            grid.Children.Add(text3);
            Grid.SetColumn(text3, 0);
            Grid.SetRow(text3, 1);
    
            Label text4 = new Label();
            text1.Content = "Doc4";
            grid.Children.Add(text4);
            Grid.SetColumn(text4, 1);
            Grid.SetRow(text4, 1);
    
            BlockUIContainer block = new BlockUIContainer(grid);
    
            Table table = new Table();
            TableRowGroup rg = new TableRowGroup();
            TableCell cell = new TableCell();
            cell.Blocks.Add(block);
            TableRow row = new TableRow();
            row.Cells.Add(cell);
            rg.Rows.Add(row);
            table.RowGroups.Add(rg);
            doc.Blocks.Add(table);
    

    【讨论】:

    • 我最初也有类似的想法,但我似乎无法让它打印网格。
    • 是的 - 如上所述,我无法让网格控件打印任何内容。上面的代码只是导致一个空白页
    • 我把婴儿和这里的洗澡水一起扔了出去。稍微调整一下就可以了(将行添加到行组并设置文本块高度) - 谢谢
    【解决方案2】:

    【讨论】:

    • 是的 - 我见过这些。不幸的是,他们没有描述引入自定义分页器如何解决我的问题
    • 您能否为“页面”的每个季度生成单独的 XPS 流文档,然后每页打印 4 页,或者让 DocumentPaginator 为您执行此操作(如示例之一所示链接)。
    【解决方案3】:

    这就是你要找的吗?

    Convert xaml flow document to xps

    【讨论】:

    • 我不认为这解决了我的问题,除非我误解了这篇文章。我需要做的是在页面上均匀地布置表格 - 页面本身打印得很好
    【解决方案4】:

    问题,您将单元格添加到 row.cell 并将行组添加到表中,但是您是否将行添加到行组?

    【讨论】:

    • 是的 - 它打印得很好,只是不是我想要的地方
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2010-12-12
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多