我想要一个表格,根据内容在逻辑上调整列的大小。这在 WPF 中可能吗?
替代文字 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>
Run Code Online (Sandbox Code Playgroud)
这可以通过确定一列最宽单元格的所需宽度来实现。可以通过循环遍历所有行确定单元格的所需宽度并记住最大值来确定最宽的单元格。
在此示例中,所有列都经过优化。值 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;
}
Run Code Online (Sandbox Code Playgroud)
这不完全是你想要的,但你可以做类似的事情
<Table.Columns>
<TableColumn Background="LightBlue" Width="2*" />
<TableColumn Background="Coral" Width="*" />
</Table.Columns>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5371 次 |
最近记录: |