基于Silverlight打印的使用详解,是否为微软的Bug问题
1:新建Silverlight4应用程序,名称为SLStudy。建好后如下:
2:在SLStudy下新建Silverlight用户控件,Print1.xaml作为要打印的控件。
在Print1.xaml里面添加代码为:
<Gridx:Name="LayoutRoot"Background="White">
<Button>这是第一个例子,简单的按钮</Button>
</Grid>
3:已经建立好了要打印的内容了,这里打印的是一个按钮。
4:修改MainPage.xaml代码如下:
<Gridx:Name="LayoutRoot"Background="White">
<StackPanel>
<Buttonx:Name="btnPrint1"Click="btnPrint1_Click">Print1</Button>
</StackPanel>
</Grid>
5:后台代码为:
privatevoidbtnPrint1_Click(objectsender,RoutedEventArgse)
{
PrintDocumentprintDocument=newPrintDocument();
printDocument.PrintPage+=newEventHandler<PrintPageEventArgs>(printDocument_PrintPage);
PrintDocument.Print("要打印的文档的名称,这个可以随便设置");
}
voidprintDocument_PrintPage(objectsender,PrintPageEventArgse)
{
e.PageVisual=newPrint1();
}
在SL4中提供打印功能的是
接着注册一个
然后调用printDocument的Print方法来打印。
在PrintDocument的PrintPage事件中,PrintPageEventArgs,是打印的参数。
里面可以获取当前打印机的一些信息。
在这里设置PageVisual,也就是要打印的对象就可以了。
voidprintDocument_PrintPage(objectsender,PrintPageEventArgse)
{
e.PageVisual=newPrint1();
}
全部写好后,可以运行应用程序,点击Print1,弹出打印窗口。打印效果如下图:
当然我们的打印需求不可能这么简单,也许需要设置Print1的内容。假设我们要修改按钮显示的字,那么我们可以这样:
voidprintDocument_PrintPage(objectsender,PrintPageEventArgse)
{
Print1printVisual=newPrint1();
printVisual.btnSample.Content="修改后的值,当然也可以从数据库中获取";
e.PageVisual=printVisual;
}
通过设置PrintPageEventArgs参数的PageVisual对象,我们就可以实现打印那个页面的功能了。
在这里我总结下:
多页打印问题:
如果要打印的只有一张,那么这种方法应该就够了,但是有时候需要将一份文档打印多张,
比如将上面的按钮打印5张,那么又该如何实现了。
还记得我们上面PrintPageEventArgs的HasMorePages参数吗?
假设我们要将上面的按钮打印5张,那么可以设置4次HasMorePages为true,最后设置HasMorePages为false就可以了。
修改后的
intcount=5;
intprintCount=0;
voidprintDocument_PrintPage(objectsender,PrintPageEventArgse)
{
Print1printVisual=newPrint1();
printVisual.btnSample.Content="修改后的值,当然也可以从数据库中获取";
e.PageVisual=printVisual;
printCount++;
if(printCount<count)//如果已经打印的页数小于要打印的页数,说明还需要打印。
{
e.HasMorePages=true;
}
else
{
e.HasMorePages=false;
}
}
有时候需要知道当前打印的是第几页,这可以通过查询
在PrintDocument_PrintPage方法中,sender对象其实就是PrintDocument对象,所以我们可以将它强制类型转换。
假设我们要将上面的5个Button的内容都修改为1,2,3,4,5.那么我们可以修改代码为:
intcount=5;
intprintCount=0;
voidprintDocument_PrintPage(objectsender,PrintPageEventArgse)
{
PrintDocumentprintDocument=senderasPrintDocument;
Print1printVisual=newPrint1();
printVisual.btnSample.Content=string.Format("按钮{0}",printDocument.PrintedPageCount);
e.PageVisual=printVisual;
printCount++;
if(printCount<count)
{
e.HasMorePages=true;
}
else
{
e.HasMorePages=false;
}
}
实际上,我们的printCount变量都不需要了,直接使用printDocument.PrintedPageCount就可以了,具体代码实现由读者自己实现吧。
如果你的打印机设置为
那么打印的结果就是*.xps的文件,但是在打印的过程中会弹出提示框,询问保存地址。
例如:
假设用户点击保存,那么PrintPage事件会再次的触发。
但是由于已经打印了一次了,所以有可能导致在多页打印的时候出现问题。
使用两个标志变量可以解决这个问题。
例如修改代码为:
///<summary> voidprintDocument_PrintPage(objectsender,PrintPageEventArgse) #region因为要经过两次,第一次是初始化,而第二次才是真正的打印,而两次PrintedPageCount都是0 isInitialized=true;//运行到这里,说明已经初始化了。 if(realPrint) Print1printVisual=newPrint1(); e.PageVisual=printVisual; printCount++; 因为两次打印,第一次可以被认为是初始化,第二次可以被认为是打印机开始真正的打印, 所以可以使用两个变量isInitialized和realPrint来分别表示是初始化还是真实的打印。 在执行第一遍的时候 在执行第二遍的时候,因为 在后面的代码中只需要判断realPrint为true就可以了。
intcount=5;
intprintCount=0;
///是否是第一次打印,因为只有第二次打印的时候才开始真正的打印。
///</summary>
privateboolisInitialized=false;
privateboolrealPrint=false;
{
PrintDocumentprintDocument=senderasPrintDocument;
intcurrentPage=printDocument.PrintedPageCount;
if(currentPage==0)
{
if(isInitialized)//如果已经初始化,则设置realPrint为true
{
realPrint=true;
}
}
#endregion
{
//PrintDocumentprintDocument=senderasPrintDocument;
printVisual.btnSample.Content=string.Format("按钮{0}",printDocument.PrintedPageCount);
if(printCount<count)
{
e.HasMorePages=true;
}
else
{
e.HasMorePages=false;
}
}
}相关文章