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.
做类似的事情
一个应用程序有一个 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.
做类似的事情