我正在使用隐藏代码在 WPF FlowDocument 中渲染Table。但是,我一直无法找到一个示例来说明如何使表格仅使用基于内容所需的空间。相反,表格占据了所有可用的宽度,这是我不想要的,我也不想指定精确的像素大小。
我显然错过了一些简单的东西,有人看到吗?
var fd = new FlowDocument();
Table t = new Table();
t.BorderBrush = Brushes.Black;
t.BorderThickness = new Thickness(2);
// I thought this would do what I wanted...
t.Columns.Add(new TableColumn() { Width = GridLength.Auto });
t.Columns.Add(new TableCOlumn() { Width = GridLength.Auto });
TableRowGroup trg = new TableRowGroup();
TableRow currentRow = new TableRow();
currentRow.Cells.Add(new TableCell(new Paragraph(new Run("ABC"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run("XYZ"))));
trg.Rows.Add(currentRow);
currentRow = new TableRow();
currentRow.Cells.Add(new TableCell(new Paragraph(new Run("123"))));
currentRow.Cells.Add(new TableCell(new Paragraph(new Run("789"))));
trg.Rows.Add(currentRow);
t.RowGroups.Add(trg);
fd.Blocks.Add(t);
我认为这是不可能的...唯一的解决方法是使用 BlockUIContainer 和真正的网格!
var fd = new FlowDocument();
Grid g = new Grid();
g.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
g.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
g.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
g.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
var t1 = new TextBlock() { Text = "ABC", Margin = new Thickness(5,3,5,3) };
t1.SetValue(Grid.ColumnProperty, 0);
t1.SetValue(Grid.RowProperty, 0);
g.Children.Add(t1);
var t2 = new TextBlock() { Text = "XYZ", Margin = new Thickness(5, 3, 5, 3) };
t2.SetValue(Grid.ColumnProperty, 1);
t2.SetValue(Grid.RowProperty, 0);
g.Children.Add(t2);
var t3 = new TextBlock() { Text = "123", Margin = new Thickness(5, 3, 5, 3) };
t3.SetValue(Grid.ColumnProperty, 0);
t3.SetValue(Grid.RowProperty, 1);
g.Children.Add(t3);
var t4 = new TextBlock() { Text = "789", Margin = new Thickness(5, 3, 5, 3) };
t4.SetValue(Grid.ColumnProperty, 1);
t4.SetValue(Grid.RowProperty, 1);
g.Children.Add(t4);
fd.Blocks.Add(new BlockUIContainer(g));
尝试 TableCell.ColoumnSpan 和 TableCell.RowSpan
我知道这个问题是 9 年前提出的,但我找到了一种不使用 BlockUIContainer 的替代方法,坦率地说,当序列化 FlowDocument 或用户只是在 RichTextBox 中编辑文档时,这是一种痛苦。
向每个表格单元格添加 PreviewMouseMove 和 PreviewMouseDown 处理程序。在 PreviewMouseMove 中,每当靠近单元格边框时,将光标更改为 SizeWE。在 PreviewMouseDown 中使用 RichTextBox 作为源捕获鼠标。
将 PreviewMouseMove 和 PreviewMouseUp 处理程序添加到 RichTextBox。在 PreviewMouseMove 中,根据计算的水平增量移动调整表列的大小。在 PreviewMouseUp 中释放鼠标。
棘手的部分是确定单元格边框在哪里,因为没有办法直接获取单元格位置或宽度。因此,您必须通过计算 PagePadding、Table Padding 和列宽度的总和来估算它们的位置。
我用这个:
table.Columns.Add(new TableColumn() { Width = GridLength.Auto });
table.Columns.Add(new TableColumn() { Width = new GridLength(64, GridUnitType.Pixel) });
table.Columns.Add(new TableColumn() { Width = new GridLength(64, GridUnitType.Pixel) });
第一列较宽,其他列较细