2009年11月22日 星期日

Silverlight 4 中的列印功能

過去的Silverlight 1,2,3,經歷了22個月,改版速度快的讓人吒舌了,但是我相信沒有比PDC的時候SL4 beta突然推出更讓人訝異的事情了,真的,我們不是前陣子才在SL3 Launch嗎? SL4 beta已經出了? 真是驗證了我以前烏鴉嘴講的揣測,看來Silverlight的改版硬是要直接追上.NET Framework的進度,一起邁向 4.0。

不過我們更關心的,是SL4增加了哪些功能? 第一個想跟你分享的,是Silverlight的列印機制,SL4提供了一個簡單到不行的概念,但其實還真的蠻實用的東西。

請參考底下這個測試頁面:[列印功能測試]
但請注意,測試前需先安裝SL4 Developer runtimes: Windows 然後才能執行

你會發現這個小程式很輕易的SL把畫面列印出來了,這個功能怎麼完成?
看看程式碼,簡單到不行:


Imports System.Windows.Printing

Partial Public Class MainPage
Inherits UserControl

Public Sub New()
InitializeComponent()
End Sub

'列印物件
Private WithEvents pd As PrintDocument

'PrintDocument的PrintPage事件負責處理要列印的東西
Private Sub pd_PrintPage(ByVal sender As Object, _
ByVal e As PrintPageEventArgs) Handles pd.PrintPage
e.PageVisual = Me '將表單本身(me)列印出
e.HasMorePages = False '後續沒有其他頁面要列印
End Sub

'Button1被按下
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
pd = New PrintDocument()
pd.DocumentName = "文件名稱" '顯示文件名稱
'列印
pd.Print()
End Sub
End Class

這個列印程式的概念幾乎和WinForm差不多,只是當然相較之下也陽春一些,但是對大多數Web應用程式來說已經夠用了,甚至很多原本ASP.NET沒法做到的列印控制,我們現在開始可以用SL建立解決方案,如果我真的要做出一些比較優質的列印效果,需要做的也只不過是利用SL在場景上繪製張圖,然後丟給PageVisual,你會發現PageVisual可以接受任何UIelement物件(包含Image),然後就那麼自然的印出來了,簡單到不行。但卻方便好用...

看來不多久就會出現SL的報表或列印解決方案套裝軟體了。

8 則留言:

泰迪熊的私藏蜂蜜 提到...

可以印出 silverlight datagrid 的所有資料嗎?

David 提到...

那你要把所有資料先呈現在某個view上面(可以在Ram裡面),然後把他往印表機丟就可以了。

匿名 提到...

既然PageVisual可以接受任何UIelement物件, 那可以用來做列印預覽嗎?

David 提到...

Sure!

匿名 提到...

我看了msdn, 發覺沒有預覽之類的函式, 也沒有將列印內容輸出成Image之類的屬性或函式(所以無法自製預覽ChildWindow);
我試了C#的msdn範例, 也只能直接列印, 無法先預覽再決定是否列印, 請問列印預覽你還有詳細一點的資料嗎?

David 提到...

預覽列印功能需由開發人員自行實現,也就是說,開發人員要自己寫這樣的功能,你可以將要顯示的資料,先動態會製在多個Canvas上,然後透過Silverlight顯示在畫面上,並且設計切頁換頁預覽等功能,即可達成預覽(所以預覽不是IE作的,是由你寫的SL App作的),待使用者確定無誤之後,再把這些Canvas一次輸出到print物件。

匿名 提到...

PageVisual都已經吃UIelement了, 但是很常用的預覽列印卻要使用者自己WriteableBitmap, 真是為德不卒耶

David 提到...

不需要用WriteableBitmap唷,Canvas是指SL中的Canvas控件, Canvas控件本身也是UIelement.