2010-09-29 7 views
15

Je rends un Table dans un WPF FlowDocument en utilisant le code-behind. Mais, j'ai été incapable de trouver un exemple qui montre comment faire que la table utilise seulement l'espace nécessaire based on content. Au lieu de cela, la table prend toute la largeur disponible, ce que je ne veux pas, et je ne veux pas avoir à spécifier une taille de pixel exacte.WPF Table Colonne Tailles

Il me manque clairement quelque chose de simple, quelqu'un le voit?

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

La question la plus proche de StackOverflow j'ai trouvé lié à c'était celui-ci, http://stackoverflow.com/questions/1491285/wpf-flowdocument-table-autofit -option, mais je suis intéressé par le code derrière, pas XAML, et je ne suis pas si sûr que ce gars a obtenu sa réponse non plus. –

+1

Cela semble être un problème connu: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a073e483-fc48-426d-9f88-e1260c9c9142 –

+0

Je suis tombé sur cela, mais je pensais que Microsoft J'avais compris que c'était une action commune depuis 2008. Mais, oui, cela semble être une manifestation du problème auquel je suis confronté. –

Répondre

8

Je ne pense pas que ce soit possible ... la seule solution de contournement hacky est d'utiliser le BlockUIContainer et une grille réelle!

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

Je viens à la conclusion que mon code original devrait fonctionner, mais qu'il y a un bogue dans WPF (et je doute que cela sera résolu en temps opportun pour que je puisse l'utiliser) . Cette «solution de contournement hacky» a été capable de me donner une solution viable à court terme. Utilisation perspicace de BlockUIContainer pour obtenir la grille dans le FlowDocument. Merci, même si une petite partie de moi est morte à l'intérieur, dans la mesure où les bibliothèques devraient fonctionner comme documentées. –

3

essayer TableCell.ColoumnSpan et TableCell.RowSpan

+1

Il s'agit d'un moyen simple et rapide d'obtenir une colonne plus grande que les autres, de définir plusieurs colonnes pour cette colonne et de définir sa colonne sur X –

Questions connexes