首页 > 解决方案 > UWP/C# 报告生成

问题描述

我正在创建一个需要包含报告的 UWP/C# 桌面应用程序。我熟悉使用 macOS CoreText 和 CGContext 在屏幕上绘图、打印或生成 PDF 文档。我似乎无法为 UWP 找到类似的东西。UWP 的 Microsoft 示例似乎使用 RichTextBlock 和其他一些有趣的方法,但这些似乎依赖于 RichTextBlock 内置的自动格式化和文本流,所以我似乎无法控制基本的事情,比如开始一个新页面或能够检查布局以将段落保持在一起。

谁能指出我如何做到这一点的正确方向。一些基本要求是:

很高兴使用 Windows 打印系统生成 PDF,因为它似乎可以转换为矢量 PDF,尽管在 UWP 下似乎无法以编程方式设置所有打印选项并且需要一些用户干预 - 现在可以接受.

编辑

我不想编辑富文本,我想从数据库中的内容生成报告,并且需要能够为新部分强制分页,将标题与以下段落保持在同一页面上,以及很快。

使用 CoreText,您可以格式化段落并询问 CoreText API 需要多少空间来呈现文本,然后您可以决定页面上是否有足够的空间来打印段落或开始新页面。

我不清楚如何使用 UWP API 实现相同的目标 - 但它必须是可能的。

例如,如果可以设置 RichTextBlock 的宽度并询问它需要多少高度来呈现它的内容,那就太好了。

标签: c#printinguwp

解决方案


好的,这就是我正在做的......

为每个报表页面动态创建 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 布局系统。


推荐阅读