我的目标:一个DocumentPaginator,它带有一个带有表的FlowDocument,该表拆分表以适应pagesize并在每个页面上重复页眉/页脚(特殊标记的TableRowGroups)。
为了拆分表格,我必须知道其行的高度。
在按代码构建FlowDocument表时,TableRows的高度/宽度为0(当然)。如果我将此文档分配给FlowDocumentScrollViewer(设置了PageSize),则计算高度等。如果不使用UI绑定对象,这可能吗?实例化未绑定到窗口的FlowDocumentScrollViewer不会强制分页/计算高度。
这就是我如何确定TableRow的高度(它适用于FlowDocumentScrollViewer显示的文档):
FlowDocument doc = BuildNewDocument();
// what is the scrollviewer doing with the FlowDocument?
FlowDocumentScrollViewer dv = new FlowDocumentScrollViewer();
dv.Document = doc;
dv.Arrange(new Rect(0, 0, 0, 0));
TableRowGroup dataRows = null;
foreach (Block b in doc.Blocks)
{
if (b is Table)
{
Table t = b as Table;
foreach (TableRowGroup g in t.RowGroups)
{
if ((g.Tag is String) && ((String)g.Tag == "dataRows"))
{
dataRows = g;
break;
}
}
}
if (dataRows != null)
break;
}
if (dataRows != null)
{
foreach (TableRow r in dataRows.Rows)
{
double maxCellHeight = 0.0;
foreach (TableCell c in r.Cells)
{
Rect start = c.ElementStart.GetCharacterRect(LogicalDirection.Forward);
Rect end = c.ElementEnd.GetNextInsertionPosition(LogicalDirection.Backward).GetCharacterRect(LogicalDirection.Forward);
double cellHeight = end.Bottom - start.Top;
if (cellHeight > maxCellHeight)
maxCellHeight = cellHeight;
}
System.Diagnostics.Trace.WriteLine("row " + dataRows.Rows.IndexOf(r) + " = " + maxCellHeight);
}
}
编辑: 我在我的示例中添加了FlowDocumentScrollViewer。调用“Arrange”会强制FlowDocument计算其高度等等。我想知道,FlowDocumentScrollViewer使用FlowDocument做了什么,所以我可以在没有UIElement的情况下完成。有可能吗?
答案 0 :(得分:0)
我的猜测是否定的,如果没有UIElement,你就无法做到。
FlowDocument本身并不实际呈现任何内容。查看分析器中的类型,看起来它只是一种数据类型。它就像有一个字符串,想要在渲染时知道它的大小...如果不做某种测量传递就不能真正做到这一点。
我不确定,但是你可以通过传递Double.PositiveInfinity的大小而不是0来获得更好的性能。至少那时它不必担心测量'n'线符。