c# - UWP/C# 报告生成
问题描述
我正在创建一个需要包含报告的 UWP/C# 桌面应用程序。我熟悉使用 macOS CoreText 和 CGContext 在屏幕上绘图、打印或生成 PDF 文档。我似乎无法为 UWP 找到类似的东西。UWP 的 Microsoft 示例似乎使用 RichTextBlock 和其他一些有趣的方法,但这些似乎依赖于 RichTextBlock 内置的自动格式化和文本流,所以我似乎无法控制基本的事情,比如开始一个新页面或能够检查布局以将段落保持在一起。
谁能指出我如何做到这一点的正确方向。一些基本要求是:
- 文本格式 - 粗体、下划线、字体大小和粗细等。
- 段落样式 - 缩进、项目符号、换行等。
- 页眉和页脚
- 将段落放在一起,例如标题与以下段落。
- 以 PDF 格式输出或打印。
很高兴使用 Windows 打印系统生成 PDF,因为它似乎可以转换为矢量 PDF,尽管在 UWP 下似乎无法以编程方式设置所有打印选项并且需要一些用户干预 - 现在可以接受.
编辑
我不想编辑富文本,我想从数据库中的内容生成报告,并且需要能够为新部分强制分页,将标题与以下段落保持在同一页面上,以及很快。
使用 CoreText,您可以格式化段落并询问 CoreText API 需要多少空间来呈现文本,然后您可以决定页面上是否有足够的空间来打印段落或开始新页面。
我不清楚如何使用 UWP API 实现相同的目标 - 但它必须是可能的。
例如,如果可以设置 RichTextBlock 的宽度并询问它需要多少高度来呈现它的内容,那就太好了。
解决方案
好的,这就是我正在做的......
为每个报表页面动态创建 XAML 页面 - 或多或少类似于 UWP 打印示例,但不需要任何打印机。
然后对于调整段落大小和开始新页面,一个相对简单的例程是这样的:
private void addParagraph(Paragraph para)
{
if (contentCanvas == null)
{
return;
}
RichTextBlock rtb = new RichTextBlock();
rtb.Blocks.Add(para);
rtb.TextWrapping = TextWrapping.Wrap;
rtb.FontSize = 12;
rtb.Foreground = new SolidColorBrush(Colors.Black);
rtb.Width = contentCanvas.Width;
rtb.Measure(new Size(contentCanvas.Width, Double.PositiveInfinity));
var size = rtb.DesiredSize;
rtb.Height = size.Height;
double fHeight = rtb.Height;
double cHeight = contentCanvas.Height;
Debug.WriteLine("y: " + y);
Debug.WriteLine("cH: " + cHeight);
Debug.WriteLine("cW: " + contentCanvas.Width);
Debug.WriteLine("rtb.H: " + fHeight);
if ((y + fHeight) > contentCanvas.Height)
{
// Create a new page
createPage();
}
contentCanvas.Children.Add(rtb);
Canvas.SetLeft(rtb, x);
Canvas.SetTop(rtb, y);
y += fHeight;
}
一些问题,因为我必须在 XAML 模板中修复 contentCanvas 的高度和宽度 - 还没有弄清楚如何在运行时执行此操作并获取 NaN 以外的值。似乎 Canvas 不会采用并返回其父级的大小。毫无疑问我不太了解 UWP 布局系统。