代码之家  ›  专栏  ›  技术社区  ›  Andrew Shepherd

WPF流程文档表-自动调整选项?

  •  4
  • Andrew Shepherd  · 技术社区  · 16 年前

    我想要一个表根据内容来逻辑地调整列的大小。这在WPF中可行吗?

    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 回复  |  直到 12 年前
        1
  •  2
  •   kenwarner    16 年前

    这不完全是你想要的,但是你可以做一些像

    <Table.Columns>
        <TableColumn Background="LightBlue" Width="2*"  />
        <TableColumn Background="Coral" Width="*" />
    </Table.Columns>
    
        2
  •  1
  •   zznobody    12 年前

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

    在本例中,所有列都进行了优化。值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;
    }
    
    推荐文章