3

WPF の DocumentPaginator に関する厳密に理論的な質問:

WPF DocumentPaginator クラスを使用して複数ページのドキュメントを印刷する場合、ページネータは、ドキュメントの印刷が完了するまで、印刷ジョブの履歴を介して要求されたすべての DocumentPages をメモリに保持しますか? それとも、印刷ジョブが終了する前に (つまり、メモリを解放するために) 不要になった DocumentPages を破棄しますか? 例外を発生させずに、印刷中に古い/不要な DocumentPages を解放するようにページネーターに手動で指示する方法はありますか?

このたびはご協力いただき、誠にありがとうございました。

4

2 に答える 2

2

私はあなたとまったく同じ問題を抱えていました。

以前にロードされたページは破棄されません。この問題を解決するために私がしたことは、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 フィールドをクリーンアップして、最後のページのメモリも解放する必要があります。

于 2011-03-22T08:49:56.283 に答える
0

System.Windows.Xps.VisualsToXpsDocumentこれを調べると、大きな xps ドキュメントを作成するときにメモリ不足になる問題が修正されます。も調べてPrintQueue.CreateXpsDocumentWriter(somePrintQueue)ください。申し訳ありませんが、これをコメントするのに十分な担当者がいません。

于 2015-04-13T19:03:55.100 に答える