Ich verwende eine Klasse, die ich von DocumentPaginator (siehe unten) abgeleitet habe, um einfache (nur Text) Berichte aus einer WPF-Anwendung zu drucken. Ich habe es so, dass alles richtig druckt, Aber wie bekomme ich es, eine Druckvorschau vor dem Drucken zu machen? Ich habe das Gefühl, ich brauche einen DocumentViewer, aber ich kann nicht herausfinden, wie.Wie wird die Vorschau gedruckt, wenn ein DocumentPaginator zum Drucken verwendet wird?
Hier ist meine Paginator Klasse:
public class RowPaginator : DocumentPaginator
{
private int rows;
private Size pageSize;
private int rowsPerPage;
public RowPaginator(int rows)
{
this.rows = rows;
}
public override DocumentPage GetPage(int pageNumber)
{
int currentRow = rowsPerPage * pageNumber;
int rowsToPrint = Math.Min(rowsPerPage, rows - (rowsPerPage * pageNumber - 1));
var page = new PageElementRenderer(pageNumber + 1, PageCount, currentRow, rowsToPrint)
{
Width = PageSize.Width,
Height = PageSize.Height
};
page.Measure(PageSize);
page.Arrange(new Rect(new Point(0, 0), PageSize));
return new DocumentPage(page);
}
public override bool IsPageCountValid { get { return true; } }
public override int PageCount { get { return (int)Math.Ceiling(this.rows/(double)this.rowsPerPage); } }
public override Size PageSize
{
get { return this.pageSize; }
set
{
this.pageSize = value;
this.rowsPerPage = PageElementRenderer.RowsPerPage(this.pageSize.Height);
if (rowsPerPage <= 0)
throw new InvalidOperationException("Page can't fit any rows!");
}
}
public override IDocumentPaginatorSource Source { get { return null; } }
}
Die PageElementRenderer ist nur ein einfaches Benutzersteuerelement, das die Daten anzeigt (im Moment nur eine Liste von Zeilen).
Hier ist, wie ich meinen Row Paginator
PrintDialog dialog = new PrintDialog();
if (dialog.ShowDialog() == true)
{
var paginator = new RowPaginator(rowsToPrint) { PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight) };
dialog.PrintDocument(paginator, "Rows Document");
}
Sorry für den Code-Dump verwenden, aber ich wollte nicht relevant, etwas verpassen.
siehe auch: http://stackoverflow.com/questions/2322064/how-can-i-produce-a-print-preview-of-a-flowdocument-in-a-wpf-application – Cheeso