关于WPF的DocumentPaginator的严格理论问题:
当使用WPF DocumentPaginator类打印多页文档时,分页程序是否在文档完成打印之前将它在打印作业历史记录上请求的所有DocumentPages保留在内存中?或者,在打印作业完成之前(即释放内存),它会处理掉任何不再需要的DocumentPages吗?有没有一种方法可以手动告诉分页器在打印过程中释放旧的/不需要的DocumentPages而不会遇到异常?
非常感谢您对此的帮助!
发布于 2011-03-22 16:49:56
我和你有完全一样的问题。
它不会处理之前加载的页面。为了解决这个问题,我所做的就是在GetPage()方法的末尾保留对加载页面的引用,并在GetPage方法的开头处理最后加载的页面。
下面是你额外问题的答案:
我的印象是,System.Windows.Controls.PrintDialog.Print(DocumentPaginator,title的实现是这样的:
Public void PrintDocument(DocumentPaginator paginator, string title)
{
Dictionary<int, DocumentPage> pages = new Dictionary<int DocumentPage>();
for(int i=0; i<paginator.PageCount(); i++)
{
pages.Add(i, paginator.GetPage(i));
UnknownPrinterEngine.SendPageToPrinter(pages(i)); //this is just imagination
}
}如果实现确实是这样,则对每个已处理页面的本地引用将保持活动状态(在字典中),直到方法执行完成。-->不会释放内存。
我做了什么来避免这种情况(在扩展DocumentPaginator的类中实现GetPage):
DocumentPage lastLoadedPage = null;
public DocumentPage GetPage(int pageNumber)
{
if(lastLoadedPage != null)
{
lastLoadedPage.Dispose()
}
//MyPrintControl should be your custom UserControl which represents the page to print
myPrintControl pageContent = new MyPrintControl();
pageContent.Width = PageSize.Width;
pageContent.Height = PageSize.Height;
pageContent.Measure(PageSize);
pageContent.Arrange(new Rect(new Point(0,0), PageSize));
DocumentPage actualPage = New DocumentPage(pageContent);
lastLoadedPage = actualPage;
return actualPage;
}最后,您应该实现IDisposable接口,并在Dispose方法中清除lastLoadedPage字段,以释放最后一页的内存。
发布于 2015-04-14 03:03:55
这解决了我在创建大型System.Windows.Xps.VisualsToXpsDocument文档时内存不足的问题。还可以研究一下PrintQueue.CreateXpsDocumentWriter(somePrintQueue)。很抱歉,我没有足够的代表来发表评论。
https://stackoverflow.com/questions/5384653
复制相似问题