Silverlight企业应用实战:SL 4.0 打印,让我拿什么说爱你?

目录:

一、基本原理

二、一些限制

三、打印,想说爱你却并不容易

 

一、基本原理

 

网上有很多关于SL 4.0的教程,其中不乏介绍SL 4.0一个重要的新特性(也是企业应用非常重要的特性)——打印。这里简单的讲解一下,会了的同学可以直接跳过这一部分。

 

实现打印主要使用PrintDocument类。

var document = new PrintDocument(); 

 

PrintDocument类主要有1个关键事件,1个关键方法

document.PrintPage += new EventHandler<PrintPageEventArgs>(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类的使用有一些限制。

 

  1. 不能够通过创建两个实例的方式同时启动两个打印任务。
  2. PrintDocument.Print方法必须由用户触发。

 

以上两种错误的使用方法都会抛出SecurityException:对话框必须由用户启动。

 

PrintDocument是通过调用COM组件实现打印的,类似于:SaveFileDialog、OpenFileDialog等。请使用时注意使用场景的限制。

 

三、打印,想说爱你却并不容易

 

打印这一功能,我相信很多人和我们一样,盼星星盼月亮~终于盼到SL 4.0正式发布的日子。

 

我们也是立即马不停蹄的开发SE的新特性,并将打印列为了比较重要的一块儿。

 

经过我们团队的 @大贲 (ben,1声,女孩子哦,技术可不输你们~)辛勤努力,我们在SE中实现了打印和打印预览功能。 

image

image

打印预览:支持单页和多页预览、设置纸张类型、方向、显示页眉、页脚、显示打印人、显示打印时间等功能。

 

就在我们认为一切OK,只等SE 4.0上线就可以将该功能交付客户使用的时候,却惊讶的发现由Silverlight产生的打印文档竟然有123MB之巨!而且还是单页!

clip_image002[5]

 

我们知道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再会!!!

 

 

你可能感兴趣的:(silverlight)