gpt4 book ai didi

WPF FlowDocument 表 - 自动调整选项?

转载 作者:行者123 更新时间:2023-12-04 14:02:12 26 4
gpt4 key购买 nike

我想要一个表格,根据内容在逻辑上调整列的大小。这在 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>

最佳答案

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

在此示例中,所有列都进行了优化。值 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;
}

关于WPF FlowDocument 表 - 自动调整选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1491285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com