我对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;
}
}
结果如下:
正如您在第二页上看到的那样,正确的单元格背景颜色会丢失。
有没有人遇到过这个问题?欢迎任何解决方案/解决方法!
编辑1:所有属性都会丢失,因此在行/列上设置背景颜色无法解决我的问题(我主要有关于TableCell边框厚度的问题)
这是一个显示边框问题的屏幕:
编辑2:查看可视树非常有启发性。分页过程似乎只在第二页上为Row生成一个ParagraphVisual,从而解释了所有视觉效果的丢失。没有视觉,因此没有背景/边框/等...
解决方案可能是调整与FlowDocument
答案 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页,第二页上放置没有边框(没有颜色)的空单元格。我无法在层次结构中找到任何处理单元格中分页符的Table
或DocumentPaginator
对象的属性。
“由于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;