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