Подтвердить что ты не робот

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

4b9b3361

Ответ 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;