Размеры столбцов таблицы WPF
Я создаю Table в WPF FlowDocument с использованием кода. Но я не смог найти пример, который показывает, как заставить таблицу использовать только пространство на основе контента. Вместо этого таблица занимает всю доступную ширину, которая мне не нужна, и я не хочу указывать точные размеры пикселей.
Мне явно не хватает чего-то простого, кто-нибудь его видит?
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);
Ответы
Ответ 1
Я не думаю, что это возможно... единственным хакерским решением является использование 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));
Ответ 2
попробуйте TableCell.ColoumnSpan и TableCell.RowSpan
Ответ 3
Я знаю, что вопрос задавался 9 лет назад, но я нашел альтернативный способ сделать это без использования BlockUIContainer, что, откровенно говоря, является проблемой при сериализации FlowDocument или когда пользователь просто редактирует документ в RichTextBox.
Добавьте обработчик PreviewMouseMove и PreviewMouseDown для каждой ячейки таблицы. В PreviewMouseMove установите курсор на SizeWE, если он находится рядом с границей ячейки. В PreviewMouseDown захватите мышь, используя RichTextBox в качестве источника.
Добавьте обработчик PreviewMouseMove и PreviewMouseUp в RichTextBox. В PreviewMouseMove измените размер столбца таблицы на основе рассчитанного горизонтального дельта-движения. В PreviewMouseUp отпустите кнопку мыши.
Сложно определить, где находятся границы ячеек, потому что нет выхода из поля, чтобы просто получить положение ячейки или ширину. Таким образом, вы должны аппроксимировать, где они находятся, путем суммирования PagePadding, Table Padding и ширины столбцов.