TableCell расщепляется после разрыва страницы: остаток разделяет часть, теряя исходные свойства ячейки
У меня есть проблема относительно стратегии разделения TableCell
в WPF 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: Взгляд на визуальное дерево довольно поучителен. Процесс разбиения на страницы, по-видимому, генерирует только один ParagraphVisual для строки на второй странице, что объясняет потерю всех визуальных эффектов. Существует нет Visual, и, следовательно, нет фона/границ/etc...
Решением может быть настройка DocumentPaginator, связанная с FlowDocument
![enter image description here]()
Ответы
Ответ 1
К сожалению, я не смог найти решение. Это, по-видимому, ошибка, присущая WPF FlowDocument, и нелегко найти точку входа в процесс разбиения на страницы.
Моя основная цель состояла в том, чтобы таблицы были правильно расщеплены среди страниц в моем документе, поэтому я решил разрешить разделить таблицу, но не на ячейки.
Это было довольно легко сделать, мне просто пришлось обернуть содержимое моей ячейки в BlockUIContainer
следующим образом:
cell1.Blocks.Add(new BlockUIContainer() { Child = new TextBlock () { Text = "Cell 1 ******************************************************************************", TextWrapping = TextWrapping.Wrap}});
Это позволяет мне не пропускать границы в таблицах разделения, но ячейки больше не могут разбиваться.
Это неудовлетворительно, но это лучшее, что я смог достичь.
Ответ 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, а на второй странице - пустая ячейка без границ (и без цвета). Я не смог найти свойство любого объекта Table
или DocumentPaginator
в иерархии, которая будет обрабатывать разрывы страниц в ячейках.
![Cell 1 made shorter]()
"Так как Cell2 короче страницы, он не разбивается, и поэтому" свободная "ячейка находится на второй странице (без свойств)"
Возможно, это время для статьи Connect?
Ответ 3
Я думаю, что добавление 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;