Размеры столбцов таблицы WPF - PullRequest
17 голосов
/ 29 сентября 2010

Я отрисовываю Таблицу в 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);

Ответы [ 3 ]

10 голосов
/ 07 октября 2010

Я не думаю, что это возможно ... Единственный хакерский способ - использовать 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));
3 голосов
/ 12 августа 2011

попробуйте TableCell.ColoumnSpan и TableCell.RowSpan

0 голосов
/ 09 июля 2019

Я знаю, что вопрос задавался 9 лет назад, но я нашел альтернативный способ сделать это без использования BlockUIContainer, что, откровенно говоря, является проблемой при сериализации FlowDocument или когда пользователь просто редактирует документ в RichTextBox.

Добавьте обработчики PreviewMouseMove и PreviewMouseDown для каждой ячейки таблицы.В PreviewMouseMove установите курсор на SizeWE, если он находится рядом с границей ячейки.В PreviewMouseDown захватите мышь, используя RichTextBox в качестве источника.

Добавьте обработчик PreviewMouseMove и PreviewMouseUp в RichTextBox.В PreviewMouseMove измените размер столбца таблицы на основе рассчитанного горизонтального дельта-движения.В PreviewMouseUp отпустите кнопку мыши.

Сложно определить, где находятся границы ячеек, потому что из коробки просто нет возможности получить положение или ширину ячейки.Таким образом, вы должны приблизительно определить их местоположение, выполнив сумму значений PagePadding, Table Padding и ширины столбцов.

...