分页后分割的TableCell:余数分割部分丢失原始单元格属性

时间:2013-01-04 10:14:09

标签: c# .net wpf flowdocument

我对WPF TableCell FlowDocument上的Table拆分策略存在问题。

这是一个简单的代码,可以重现这个问题:

MainWindow.xaml.cs

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var table = new Table() { BorderThickness = new Thickness(1), BorderBrush = Brushes.Black, CellSpacing = 0 };
        var rowGroup = new TableRowGroup();
        var tableRow = new TableRow();
        var cell1 = new TableCell() { Background = Brushes.Red, BorderThickness = new Thickness(0, 0, 1, 0), BorderBrush = Brushes.Black };
        var cell2 = new TableCell() { Background = Brushes.Red };

        cell1.Blocks.Add(new Paragraph(new Run("Cell 1 ******************************************************************************")));
        cell2.Blocks.Add(new Paragraph(new Run("Cell 2")));
        tableRow.Cells.Add(cell1);
        tableRow.Cells.Add(cell2);
        rowGroup.Rows.Add(tableRow);
        table.RowGroups.Add(rowGroup);

        var flowDocument = new FlowDocument();
        flowDocument.Blocks.Add(table);

        Content = flowDocument;
    }
}

结果如下:

TableCell Split

正如您在第二页上看到的那样,正确的单元格背景颜色会丢失。

有没有人遇到过这个问题?欢迎任何解决方案/解决方法!

编辑1:所有属性都会丢失,因此在行/列上设置背景颜色无法解决我的问题(我主要有关于TableCell边框厚度的问题)

这是一个显示边框问题的屏幕:

enter image description here

编辑2:查看可视树非常有启发性。分页过程似乎只在第二页上为Row生成一个ParagraphVisual,从而解释了所有视觉效果的丢失。没有视觉,因此没有背景/边框/等... 解决方案可能是调整与FlowDocument

相关联的DocumentPaginator

enter image description here

3 个答案:

答案 0 :(得分:2)

我已经更改了您的代码,以更多地展示Eyal H所说的内容:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var table = new Table() { BorderThickness = new Thickness(1), BorderBrush = Brushes.Black, CellSpacing = 4 };
        var rowGroup = new TableRowGroup();
        var tableRow = new TableRow();
        var cell1 = new TableCell() { RowSpan = 1, Background = Brushes.Red, BorderThickness = new Thickness(3, 3, 3, 3), BorderBrush = Brushes.Green };
        var cell2 = new TableCell() { RowSpan = 1, Background = Brushes.Red, BorderThickness = new Thickness(2, 2, 2, 2), BorderBrush = Brushes.Blue };

        var correctContent = "**************************************************************************************************************************************************************************************************************************************";

        cell1.Blocks.Add(new Paragraph(new Run("Cell 1" + correctContent)));
        cell2.Blocks.Add(new Paragraph(new Run("Cell 2" + correctContent.Replace("*","   ")+".")));
        tableRow.Cells.Add(cell1);
        tableRow.Cells.Add(cell2);
        rowGroup.Rows.Add(tableRow);
        table.RowGroups.Add(rowGroup);

        var flowDocument = new FlowDocument();
        flowDocument.Blocks.Add(table);

        Content = flowDocument;
    }
}

Cell 2有许多以点结尾的空格。单元格1适合第1页,第二页上放置没有边框(没有颜色)的空单元格。我无法在层次结构中找到任何处理单元格中分页符的TableDocumentPaginator对象的属性。

Cell 1 made shorter

“由于Cell2比它不分割的页面短,因此”空“单元格位于第二页(没有属性)”

也许是时候发表Connect文章了?

答案 1 :(得分:2)

可悲的是,我无法找到解决方案。这似乎是WPF FlowDocument固有的错误,并且在分页过程中找到一个入口点并不容易。

我的主要目标是让表格在我的文档中的页面之间正确分割,所以我最终决定允许表格分割,而不是单元格。

这很容易做到,我只需要将我的单元格内容包装在这样的BlockUIContainer中:

cell1.Blocks.Add(new BlockUIContainer() { Child = new TextBlock () { Text = "Cell 1 ******************************************************************************", TextWrapping = TextWrapping.Wrap}});

这使我可以避免在拆分表中丢失边框,但单元格不能再拆分。

这并不令人满意,但却是我所能达到的最佳目标。

答案 2 :(得分:-2)

我认为添加TableColumn可以解决您的问题。下面是示例代码。

var table = new Table() { BorderThickness = new Thickness(1), BorderBrush = Brushes.Black, CellSpacing = 0 };
        var rowGroup = new TableRowGroup();
        var tableRow = new TableRow();
        var tableColumn1 = new TableColumn { Background = Brushes.Red };
        var tableColumn2 = new TableColumn { Background = Brushes.Red };
        var cell1 = new TableCell() { Background = Brushes.Red, BorderThickness = new Thickness(0, 0, 1, 0), BorderBrush = Brushes.Black };
        var cell2 = new TableCell() { Background = Brushes.Red };

        cell1.Blocks.Add(new Paragraph(new Run("Cell 1 ******************************************************************************")));
        cell2.Blocks.Add(new Paragraph(new Run("Cell 2")));
        tableRow.Cells.Add(cell1);
        tableRow.Cells.Add(cell2);
        rowGroup.Rows.Add(tableRow);
        table.Columns.Add(tableColumn1);
        table.Columns.Add(tableColumn2);
        table.RowGroups.Add(rowGroup);

        var flowDocument = new FlowDocument();
        flowDocument.Blocks.Add(table);

        Content = flowDocument;