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的報表或列印解決方案套裝軟體了。

留言

Unknown寫道…
可以印出 silverlight datagrid 的所有資料嗎?
David寫道…
那你要把所有資料先呈現在某個view上面(可以在Ram裡面),然後把他往印表機丟就可以了。
匿名表示…
既然PageVisual可以接受任何UIelement物件, 那可以用來做列印預覽嗎?
匿名表示…
我看了msdn, 發覺沒有預覽之類的函式, 也沒有將列印內容輸出成Image之類的屬性或函式(所以無法自製預覽ChildWindow);
我試了C#的msdn範例, 也只能直接列印, 無法先預覽再決定是否列印, 請問列印預覽你還有詳細一點的資料嗎?
David寫道…
預覽列印功能需由開發人員自行實現,也就是說,開發人員要自己寫這樣的功能,你可以將要顯示的資料,先動態會製在多個Canvas上,然後透過Silverlight顯示在畫面上,並且設計切頁換頁預覽等功能,即可達成預覽(所以預覽不是IE作的,是由你寫的SL App作的),待使用者確定無誤之後,再把這些Canvas一次輸出到print物件。
匿名表示…
PageVisual都已經吃UIelement了, 但是很常用的預覽列印卻要使用者自己WriteableBitmap, 真是為德不卒耶
David寫道…
不需要用WriteableBitmap唷,Canvas是指SL中的Canvas控件, Canvas控件本身也是UIelement.

這個網誌中的熱門文章

原來使用 .net 寫個 MCP Server 如此簡單

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

開啟 teams 中的『會議轉錄(謄寫)』與Copilot會議記錄、摘要功能

在VS Code當中使用 Azure DevOps MCP Server

原來使用 .net 寫個 MCP Client 也如此簡單