gpt4 book ai didi

wpf - WPF DocumentPaginator 是否将所有 DocumentPages 保留在内存中直到完成打印作业?

转载 作者:行者123 更新时间:2023-12-02 03:32:41 26 4
gpt4 key购买 nike

有关 WPF DocumentPaginator 的严格理论问题:

当使用 WPF DocumentPaginator 类打印多页文档时,分页器是否将其请求的所有 DocumentPages 保留在内存中的打印作业历史记录中,直到文档完成打印?或者在打印作业完成之前它是否曾经处理过不再需要的任何 DocumentPages(即释放内存)?有没有办法手动告诉分页器在打印过程中释放旧的/不需要的 DocumentPages 而不会出现异常?

非常感谢您的帮助!

最佳答案

我遇到了和你完全相同的问题。

它不会处理之前加载的页面。为了解决这个问题,我所做的就是在 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 接口(interface),并在 Dispose 方法中清理 LastLoadedPage 字段,以释放最后一页的内存。

关于wpf - WPF DocumentPaginator 是否将所有 DocumentPages 保留在内存中直到完成打印作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com