目录:
一、基本原理
二、一些限制
三、打印,想说爱你却并不容易
一、基本原理
网上有很多关于SL 4.0的教程,其中不乏介绍SL 4.0一个重要的新特性(也是企业应用非常重要的特性)——打印。这里简单的讲解一下,会了的同学可以直接跳过这一部分。
实现打印主要使用PrintDocument类。
var document = new PrintDocument();
PrintDocument类主要有1个关键事件,1个关键方法
document.PrintPage += new EventHandler(document_PrintPage);
document.Print("Test Document");
PrintPage事件的用法如下:void document_PrintPage(object sender, PrintPageEventArgs e)
{
e.PageVisual = new Rectangle() { Fill = new SolidColorBrush(Colors.Blue) }; //要打印的UIElement
e.HasMorePages = false; //默认为false
}
如果为多页打印,则需要将 e.HasMorePages = true
此时PrintPage事件将被多次触发,直到e.HasMorePages为false为止。
PrintDocument类还有2个事件,分别是BeginPrint和EndPrint,分别在打印任务开始和结束时触发(无论多少页,各触发一次)。
二、一些限制
在实际使用过程中发现PrintDocument类的使用有一些限制。
- 不能够通过创建两个实例的方式同时启动两个打印任务。
- PrintDocument.Print方法必须由用户触发。
以上两种错误的使用方法都会抛出SecurityException:对话框必须由用户启动。
PrintDocument是通过调用COM组件实现打印的,类似于:SaveFileDialog、OpenFileDialog等。请使用时注意使用场景的限制。
三、打印,想说爱你却并不容易
打印这一功能,我相信很多人和我们一样,盼星星盼月亮~终于盼到SL 4.0正式发布的日子。
我们也是立即马不停蹄的开发SE的新特性,并将打印列为了比较重要的一块儿。
经过我们团队的 @大贲 (ben,1声,女孩子哦,技术可不输你们~)辛勤努力,我们在SE中实现了打印和打印预览功能。
打印预览:支持单页和多页预览、设置纸张类型、方向、显示页眉、页脚、显示打印人、显示打印时间等功能。
就在我们认为一切OK,只等SE 4.0上线就可以将该功能交付客户使用的时候,却惊讶的发现由Silverlight产生的打印文档竟然有123MB之巨!而且还是单页!
我们知道SL 4.0的打印是基于位图的,也知道位图肯定要比矢量图大,但是我们没有想到的是。。大的也太多了吧!!
(我们测试了一个分页为4页的文档,竟然有492MB之巨,直接的结果就是。。。打印机死掉了。。。)
============== 无奈的分割线 ==============
我们将该问题反馈给微软后,得到的答复如下:
根据我们的调查,发现这是因为Silverlight 4的打印功能是基于位图所致。假设打印对象的大小是:8.27 X 11.69 英寸,打印机的输出设置在600dpi,颜色设置为32位真彩色的话,那么Silverlight送到打印机的文件大小即为:8.27x11.69x600x600x4=139213872 Byte,约等于132MB,文件的size的确是很大,这是因为Silverlight 4打印功能是基于位图的而不是基于矢量图,所以在当前情况下,可能只能请您尽可能地把打印机的DPI设置的稍微低一点,来缩小打印文件的大小了。或者您可以选择打印网页,而不是直接打印XAML。
对于SL打印的改进,微软的回复如下:
根据我和产品组的确认结果,他们的确已经接到了很多类似的反馈,反映说由于打印功能是基于位图的,所以会造成很大的文件,他们将在设计下一代产品时,把基于矢量图的打印支持作为一个重要的候选特性进行考虑。非常抱歉现在给您带来的不便。同时我们非常感谢您的反馈,对如何改进Silverlight产品更贴近我们用户需求来说,这将是非常重要的和有价值的参考意见。
============== 最后总结的分割线 ==============
经过公司层面慎重讨论,我们不得不从SE 4.0版本中撤下SL 4.0原生打印支持这一特性。
作为软件服务提供商,我们不能要求我们的客户去做什么,我们只能将最简单、最好用的功能提供给客户。
向在这一特性上花费了时间和精力的同事们致敬,我也相信在这一过程中你们学到了很多东西。
至少,我们知道,SL 4.0之后我们还在盼着什么~
打印,SL 5.0再会!!!