Silverlight 4 - 打印项目控制

时间:2010-05-05 14:42:12

标签: silverlight silverlight-4.0

我正在构建Silverlight 4应用程序。此应用程序将打印ItemsControl的内容。此ItemsControl使用ItemTemplate呈现绑定到控件的项。总之,我有500个与控件绑定的项目。

奇怪的是,当我尝试打印ItemsControl时,它似乎在某一点之后被切断了。我不知道什么时候被切断了。我只知道它被切断了。我预感它与虚拟化有关。但是,我不知道如何克服这一点。目前,我正在打印ItemsControl,如下所示:

private void printHyperlink_Click(object sender, RoutedEventArgs e)
{
  PrintDocument printDocument = new PrintDocument();
  printDocument.BeginPrint += 
    new EventHandler<BeginPrintEventArgs>(printDocument_BeginPrint);
  printDocument.PrintPage += 
    new EventHandler<PrintPageEventArgs>(printDocument_PrintPage);
  printDocument.EndPrint += 
    new EventHandler<EndPrintEventArgs>(printDocument_EndPrint);

  printDocument.Print("My Items");
}

void printDocument_BeginPrint(object sender, BeginPrintEventArgs e)
{}

void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{ e.PageVisual = myItemsControl; }

void printDocument_EndPrint(object sender, EndPrintEventArgs e)
{}

我做错了什么?如何确保ItemsControl中的所有项目在呈现时都打印出来?

1 个答案:

答案 0 :(得分:2)

打印API不会自动为ItemsControl中的项目分页。此外,如果要打印可视树中已有的内容,结果可能会被裁剪以匹配打印时窗口中呈现的内容。

要打印多个页面,您需要:

  • 测量以确定页面上显示的项目数
  • 创建仅在该页面上显示所需项目的视觉效果
  • 将它们传递到您的“e.PageVisual”
  • 将e.HasMorePages设置为true,直到您在最后一页

总而言之,这可能是相当多的工作。如果您只是尝试使用ItemTemplate打印ItemsControl,则必须完成上述所有工作。对于稍微复杂的场景(例如添加页码,页眉/页脚等),还有更多工作要做。

也就是说,可以通过简单的Silverlight打印API构建一个库来执行类似的操作。我最近在博客上写了一个控件,旨在解决这个问题(以及一些更复杂的问题)。

http://www.davidpoll.com/2010/04/16/making-printing-easier-in-silverlight-4/