2010-05-05 80 views
1

我正在构建Silverlight 4应用程序。这个应用程序将打印一个ItemsControl的内容。此ItemsControl使用ItemTemplate呈现绑定到控件的项目。总而言之,我有500件必然会受到控制的物品。Silverlight 4 - 打印项目控件

奇怪的是,当我试图打印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中的所有项目在呈现时都被打印?

+0

+1,这是一个很好的问题。 – AnthonyWJones 2010-05-05 15:50:01

+0

超过一页的500个值是正确的?你确实将HasMorePages属性设置为true来表明这一点? – texmex5 2010-05-05 21:00:48

回答

2

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

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

  • 措施弄清楚有多少项目在页面上展示
  • 创建的视觉效果,只有该网页上显示你想要的物品
  • 将它们传递到你的“e.PageVisual”
  • 设置e.HasMorePages直到你最后一页

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

也就是说,可以在简单的Silverlight打印API上构建一个库,它可以完成这样的事情。我最近写了一篇旨在解决这种情况的控件(以及一些更复杂的控件)。

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