我正在创建一个UWP/C#桌面应用程序,需要包括报告。我熟悉使用macOS CoreText和CGContext在屏幕上绘图、打印或生成PDF文档。对于UWP,我似乎找不到类似的东西。微软的UWP示例似乎使用了RichTextBlock和其他一些有趣的方法,但这些方法似乎依赖于内置到RichTextBlock的自动格式化和文本流,因此我似乎无法控制基本的事情,比如启动一个新页面或能够检查布局以将段落放在一起。
有人能为我指出正确的方向吗?其中一些基本要求是:
乐意使用windows打印系统生成PDF,因为它似乎转换为矢量PDF,这是好的,虽然它似乎在UWP下,它不可能以编程方式设置所有打印选项和一些用户干预是需要的-将是暂时的。
编辑
我不想编辑富文本,我想要从数据库中的内容中生成一个报告,并且需要能够为新的部分强制分页,保持页眉与下一段相同,等等。
使用CoreText,您可以格式化一个段落,并询问CoreText API它需要多少空间来呈现文本,然后您可以决定页面上是否有足够的空间来打印段落或开始一个新页面。
我不清楚如何使用UWP API实现同样的目标--但这必须是可能的。
例如,如果可以设置一个RichTextBlock的宽度,并询问它需要多少高度来呈现它的内容,那就太棒了。
发布于 2019-07-26 14:02:03
所以这就是我要做的..。
动态地为每个报表页创建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以外的值。似乎画布不会采用并返回其父级的大小。毫无疑问,我不太了解UWP的布局系统。
https://stackoverflow.com/questions/57157328
复制相似问题