1:新建Silverlight4 應用程序,名稱為SLStudy。建好后如下:
2:在SLStudy下新建Silverlight用戶控件,Print1.xaml作為要打印的控件。
在Print1.xaml里面添加代碼為:
4:修改MainPage.xaml代碼如下:
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
e.PageVisual = new Print1();
}
在SL4 中提供打印功能的是PrintDocument類,所以先實例化一個該類對象。
接著注冊一個PrintPage事件,PrintPage事件在打印的時候會觸發。
然后調用printDocument的Print方法來打印。
在PrintDocument的PrintPage事件中,PrintPageEventArgs,是打印的參數。
里面可以獲取當前打印機的一些信息。
在這里設置PageVisual,也就是要打印的對象就可以了。
當然我們的打印需求不可能這么簡單,也許需要設置Print1的內容。假設我們要修改按鈕顯示的字,那么我們可以這樣:
在這里我總結下:
1:確定要打印的內容,然后新建一個UserControl來顯示打印的內容。
2:新建PrintDocument對象,注冊PrintPage事件,調用Print方法。
3:在PrintPage事件中,構造要打印的對象,然后去數據庫中獲取數據,然后把數據綁定到控件上,接著把綁定好數據的控件賦值給PrintPageEventArgs的PageVisual 對象。
多頁打印問題:
如果要打印的只有一張,那么這種方法應該就夠了,但是有時候需要將一份文檔打印多張,
比如將上面的按鈕打印5張,那么又該如何實現了。
還記得我們上面PrintPageEventArgs的HasMorePages參數嗎?
在PrintPage 事件觸發后,默認的HasMorePages 為false。將HasMorePages設置為true,可以讓PrintPage事件不斷被觸發。當 HasMorePages 屬性為 true,PrintPage 事件將多次發生,直到 HasMorePages 為 false。
假設我們要將上面的按鈕打印5張,那么可以設置4次HasMorePages為true,最后設置HasMorePages為false就可以了。
修改后的printDocument_PrintPage 方法如下:
if (printCount < count) //如果已經打印的頁數小于要打印的頁數,說明還需要打印。
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
在PrintDocument_PrintPage 方法中,sender對象其實就是PrintDocument對象,所以我們可以將它強制類型轉換。
假設我們要將上面的5個 Button的內容都修改為1,2,3,4,5.那么我們可以修改代碼為:
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
PrintDocument printDocument = sender as PrintDocument;
Print1 printVisual = new Print1();
printVisual.btnSample.Content = string.Format("按鈕{0}", printDocument.PrintedPageCount);
e.PageVisual = printVisual;
printCount++;
if (printCount < count)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
微軟的Bug??
如果你的打印機設置為
那么打印的結果就是*.xps的文件,但是在打印的過程中會彈出提示框,詢問保存地址。
如果你在PrintPage事件中打上斷點的話,可以看到在詢問保存地址的時候,PrintPage方法已經執行了,也就是說PringPage方法會被執行兩遍,第一遍并沒有真正的打印。
例如:
如果在上圖的界面上點擊取消,則有可能會導致系統失去響應而卡死,
假設用戶點擊保存,那么PrintPage事件會再次的觸發。
但是由于已經打印了一次了,所以有可能導致在多頁打印的時候出現問題。
使用兩個標志變量可以解決這個問題。
例如修改代碼為:
/// <summary>
/// 是否是第一次打印,因為只有第二次打印的時候才開始真正的打印。
/// </summary>
private bool isInitialized = false;
private bool realPrint = false;
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
PrintDocument printDocument = sender as PrintDocument;
int currentPage = printDocument.PrintedPageCount;
#region 因為要經過兩次,第一次是初始化,而第二次才是真正的打印,而兩次PrintedPageCount都是0
if (currentPage == 0)
{
if (isInitialized) //如果已經初始化,則設置realPrint為true
{
realPrint = true;
}
isInitialized = true; //運行到這里,說明已經初始化了。
}
#endregion
if (realPrint)
{
//PrintDocument printDocument = sender as PrintDocument;
Print1 printVisual = new Print1();
printVisual.btnSample.Content = string.Format("按鈕{0}", printDocument.PrintedPageCount);
e.PageVisual = printVisual;
printCount++;
if (printCount < count)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
}
因為兩次打印,第一次可以被認為是初始化,第二次可以被認為是打印機開始真正的打印,
所以可以使用兩個變量isInitialized 和realPrint 來分別表示是初始化還是真實的打印。
在執行第一遍的時候printDocument.PrintedPageCount ==0,在這時候將isInitialized 設置為true。
在執行第二遍的時候,因為isInitialized ==true,所以可以將realPrint設置為true。
在后面的代碼中只需要判斷realPrint為true就可以了。
新聞熱點
疑難解答