2010-09-29 88 views
15

我使用代碼隱藏在WPF FlowDocument中呈現Table。但是,我一直無法找到一個例子,說明如何讓桌子只使用需要的空間based on content。相反,表佔用了所有可用的寬度,我不想要,也不想指定確切的像素大小。WPF表列大小

我很明顯缺少一些簡單的東西,有人看到它?

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); 
+0

最近的StackOverflow問題,我發現與此相關的是這樣的一個,http://stackoverflow.com/questions/1491285/wpf-flowdocument-table-autofit -option,但我對後面的代碼感興趣,而不是XAML,而且我不確定這個人是否也回答了他的問題。 – 2010-09-29 14:35:42

+1

這似乎是一個已知問題:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a073e483-fc48-426d-9f88-e1260c9c9142 – 2010-10-04 21:11:49

+0

我碰到了,但認爲微軟自2008年以來一直採取行動。但是,是的,這似乎是我面臨的問題的一種表現。 – 2010-10-05 13:38:12

回答

8

我不認爲這是可能的...唯一的hacky解決方法是使用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)); 
+0

我得出的結論是,我的原代碼應該可以工作,但是WPF中存在一個錯誤(我懷疑這會及時解決,以便我使用它) 。這種「哈克解決方法」能夠給我一個可行的短期解決方案。有見識地使用BlockUIContainer將網格放入FlowDocument中。謝謝,雖然我的一小部分已經死在圖書館應該按照記錄工作。 – 2010-10-07 18:54:02

3

嘗試TableCell.ColoumnSpan和TableCell.RowSpan

+1

這是一種快速和骯髒的方式來獲得比其他人更大的列,爲其定義多個列並將其列爲X – 2014-07-15 15:58:00