【问题标题】:Silverlight 4 - Print Items ControlSilverlight 4 - 打印项目控制
【发布时间】:2010-05-05 14:42:12
【问题描述】:

我正在构建一个 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,这是一个很好的问题。
  • 超过一页的 500 个值对吗?您确实将 HasMorePages 属性设置为 true 以表明这一点?

标签: silverlight silverlight-4.0


【解决方案1】:

打印 API 不会为您自动对 ItemsControl 中的项目进行分页。此外,如果您正在打印视觉树中已经存在的内容,则结果可能会被剪裁以匹配打印时窗口中呈现的内容。

要打印多页,您需要:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多