2009-09-29 84 views
3

我想要一个表根据内容在逻辑上对列进行大小调整。这在WPF中可能吗?WPF FlowDocument表 - AutoFit选项?

alt text http://img43.imageshack.us/img43/2640/flowdocument.jpg

这是我的工作代码:

<Window x:Class="FlowDocument.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <Style TargetType="{x:Type TableCell}"> 
      <Setter Property="BorderBrush" Value="Gray" /> 
      <Setter Property="BorderThickness" Value="3" /> 


     </Style> 
     <Style TargetType="{x:Type Paragraph}"> 
      <Setter Property="Padding" Value="2, 2, 2, 2" /> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <FlowDocumentScrollViewer> 
      <FlowDocument> 
       <Table> 
        <Table.Columns> 
         <TableColumn Background="LightBlue" /> 
         <TableColumn Background="Coral" /> 
        </Table.Columns> 
        <TableRowGroup> 
         <TableRow> 
          <TableCell> 
           <Paragraph>This is a long piece of text</Paragraph> 
          </TableCell> 
          <TableCell> 
           <Paragraph>This isn't</Paragraph> 
          </TableCell> 
         </TableRow> 
         <TableRow> 
          <TableCell> 
           <Paragraph>This is a another long piece of text. The column should be wider than the other one!</Paragraph> 
          </TableCell> 
          <TableCell> 
           <Paragraph>Ditto</Paragraph> 
          </TableCell> 
         </TableRow> 
        </TableRowGroup> 
       </Table> 
      </FlowDocument> 
     </FlowDocumentScrollViewer> 
    </Grid> 
</Window> 

回答

2

它不太你在找什么,但你可以做这样的事情

<Table.Columns> 
    <TableColumn Background="LightBlue" Width="2*" /> 
    <TableColumn Background="Coral" Width="*" /> 
</Table.Columns> 
+0

我猜字面上正确的答案是一个简单的“不,你不能”。这些信息更有用,所以我会给它打勾。 – 2011-01-04 10:23:49

1

它通过确定柱的最宽单元的期望宽度是可能的。最宽的单元格可以通过循环遍历所有行来确定单元格的期望宽度并记住最大值。

在这个例子中,所有的列都进行了优化。 19的值可能来自左右单元格填充加单元格边框厚度。

void autoresizeColumns(Table table) 
{ 
    TableColumnCollection columns = table.Columns; 
    TableRowCollection rows = table.RowGroups[0].Rows; 
    TableCellCollection cells; 
    TableRow row; 
    TableCell cell; 

    int columnCount = columns.Count; 
    int rowCount = rows.Count; 
    int cellCount = 0; 

    double[] columnWidths = new double[columnCount]; 
    double columnWidth; 

    // loop through all rows 
    for (int r = 0; r < rowCount; r++) 
    { 
     row = rows[r]; 
     cells = row.Cells; 
     cellCount = cells.Count; 

     // loop through all cells in the row  
     for (int c = 0; c < columnCount && c < cellCount; c++) 
     { 
      cell = cells[c]; 
      columnWidth = getDesiredWidth(new TextRange(cell.ContentStart, cell.ContentEnd)) + 19; 

      if (columnWidth > columnWidths[c]) 
      { 
       columnWidths[c] = columnWidth; 
      } 
     } 
    } 

    // set the columns width to the widest cell 
    for (int c = 0; c < columnCount; c++) 
    { 
     columns[c].Width = new GridLength(columnWidths[c]); 
    } 
} 


double getDesiredWidth(TextRange textRange) 
{ 
    return new FormattedText(
     textRange.Text, 
     CultureInfo.CurrentCulture, 
     FlowDirection.LeftToRight, 
     new Typeface(
      textRange.GetPropertyValue(TextElement.FontFamilyProperty) as FontFamily, 
      (FontStyle)textRange.GetPropertyValue(TextElement.FontStyleProperty), 
      (FontWeight)textRange.GetPropertyValue(TextElement.FontWeightProperty), 
      FontStretches.Normal), 
      (double)textRange.GetPropertyValue(TextElement.FontSizeProperty), 
     Brushes.Black, 
     null, 
     TextFormattingMode.Display).Width; 
} 
+0

这可能是解决问题的开始。但是如果所需列宽的总和超过可用宽度会发生什么? – 2014-05-11 22:21:26

+0

亲爱的安德鲁,在我的解决方案中,我通过检查可用宽度来处理它。如果总数超过,我正在使用一个因子,它是可用宽度和所有列的所需总宽度的商。不幸的是,我不知道星星的长度。所以如果可用宽度发生变化,它需要重新计算自己代码中的所有宽度。 – zznobody 2014-05-13 19:30:56