12

TableCellWPFの分割戦略に関する問題があり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 分割

2 ページ目にあるように、右側のセルの背景色が失われています。

誰かがすでにこの問題に遭遇しましたか? 解決策/回避策は大歓迎です!

編集1:すべてのプロパティが失われるため、行/列に背景色を設定しても問題は解決しません(主にTableCell Border Thicknessesに関する問題があります)

境界線の問題を示す画面は次のとおりです。

ここに画像の説明を入力

編集 2:ビジュアル ツリーを見ると、かなり有益です。ページネーション プロセスでは、2 ページ目の Row に対して ParagraphVisual が 1 つしか生成されないように見えるため、すべての視覚効果が失われます。ビジュアルがないため、背景/境界線/その他はありません... 解決策は、に関連付けられているDocumentPaginatorを微調整することです。FlowDocument

ここに画像の説明を入力

4

3 に答える 3

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

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 に収まり、境界線のない (色のない) 空のセルが 2 ページ目に配置されます。セル内の改ページを処理する階層内のいずれTableかまたはオブジェクトのプロパティを見つけることができませんでした。DocumentPaginator

セル 1 を短くしました

「Cell2 はページよりも短いため、分割されず、「空の」セルが 2 番目のページに配置されます (プロパティなし)」

たぶん、Connect の記事の時間でしょうか?

于 2013-01-08T17:51:03.713 に答える
-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 に答える