12

TableCell我对 WPF的拆分策略有疑问FlowDocument Table

这是一个允许重现问题的简单代码:

主窗口.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;
    }
}

这是结果:

表格单元拆分

正如您在第二页上看到的,右侧单元格的背景颜色丢失了。

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

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

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

在此处输入图像描述

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

在此处输入图像描述

4

3 回答 3

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;
    }
}

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

单元格 1 变短

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

也许是时候写一篇 Connect 文章了?

于 2013-01-08T17:51:03.713 回答
2

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

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

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

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

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

这并不令人满意,但这是我能够达到的最好的。

于 2013-01-13T16:14:24.770 回答
-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;
于 2013-01-12T13:55:51.653 回答