Canvas 的上层不可见部分无法打印

Upper invisible part of a Canvas cannot be printed

一个应用程序有一个 Canvas 大小的 A4 页面嵌入在 ScrollViewer 中:

<ScrollViewer > 
    <Canvas Name="PageCanvas"  Width="21cm" Height="29.7cm">

效果很好。现在,当用户想要打印时,应用会执行以下操作:

PrintDialog dlg = new System.Windows.Controls.PrintDialog();
if (dlg.ShowDialog() == true)
     dlg.PrintVisual(this.PageCanvas, "Document");

问题: 打印输出总是只从 Canvas 的 visible 部分开始。

因此,当您向下滚动时,canvas 的 top 上的不可见部分在打印输出中 不可见

然而,这真的很奇怪,Canvas 的 底部 上的不可见部分 始终可见 打印!

所以这里出了什么问题?

我发现 here on MSDN 的一个解决方法是在调用代码打印之前将滚动查看器设置回顶部。

如果你想要一些不那么骇人听闻的东西,几年前我参与了一个项目,我将数据模板设置为 XAML window 绑定,然后打开window成FixedDoc可以直接打印,也可以转成xps文件以后批量打印。转换看起来像这样。

private FixedDocument ConvertToDoc(DocInfo pageData)
    {
        FixedDocument fixedDoc = new FixedDocument();
        PageContent content = new PageContent();
        FixedPage page = new FixedPage();
        DocTemplate printTemplate = new DocTemplate(pageData);
        page.Children.Add(printTemplate);
        ((System.Windows.Markup.IAddChild)content).AddChild(page);
        fixedDoc.Pages.Add(content);
        return fixedDoc;
    }

其中 DocTemplate 是我布置的 xaml 页面,pageData 是它绑定到的模型对象。您也许可以用 canvas.

做类似的事情