0

私はWPFで印刷に取り組んでいます。
クラスを継承するクラスを実装しDocumentPaginatorます

public class ReportPaginator : DocumentPaginator
{
    private double pageUpperLimit;

    private double pageDownLimit;

    private Model.Report printedReport;

    private int pageCount;

    public override IDocumentPaginatorSource Source
    {
        get
        {
            return null;
        }
    }

    public override bool IsPageCountValid
    {
        get { return true; }
    }

    public override int PageCount
    {
        get { return pageCount; }
    }

    public override Size PageSize
    {
        get
        {
            return new Size(printedReport.PageSize.Width, printedReport.PageSize.Height);
        }
        set
        {
            // validate the value.
            if (value != null)
            {
                throw new ArgumentException("page size can not be null");
            }

            // TODO: here we have to validate if the page is A3, A4, A5. this is to set the SizeName.
            // if you did not set the sizeName here we will get an exception.
            printedReport.PageSize = new Model.PageSize { Height = value.Height, Width = value.Width };
            CalculatesPage();
            // if we have to set the PageSize (I do not think so), do not forget to call the PaginateData method.
        }
    }

    public ReportPaginator( Model.Report report)
    {
        printedReport = report;
        CalculatesPage();
    }

    public override DocumentPage GetPage(int pageNumber)
    {
        // validate the argument.
        if (pageNumber < 0)
        {
            throw new ArgumentException("pageNumber parameter could not be negative number", "pageNumber");
        }

        // if the argument is outside of the available pages, return 
        if (pageNumber > pageCount - 1)
        {
            return DocumentPage.Missing;
        }

        // specify the start pixel and end pixel of the page according to the height of the report.
        pageUpperLimit = pageNumber * PageSize.Height;
        pageDownLimit = (pageNumber + 1) * PageSize.Height;

        // create DrawingVisual for this DocumentPage
        DrawingVisual visual = new DrawingVisual();

        // get the DrawingContext for this DrawingVisual for this page.
        using (DrawingContext pageContext = visual.RenderOpen())
        {
            // drawing operations for elements and sections go here.

            // we will use the for loop instead of the foreach loop to enumerate the sections
            // because we will need the know in which section we draw.
            for (int sectionIndex = 0; sectionIndex < printedReport.Sections.Count; sectionIndex++)
            {
                PrintSection(pageContext, sectionIndex);

                foreach (Model.BaseReportControl control in printedReport.Sections[sectionIndex].Controls)
                {
                    PrintControl(pageContext, sectionIndex, control);
                }
            }
        }  // close the DrawingContext.

        return new DocumentPage(visual);
    }
}

仕事をするためのより多くのヘルパーメソッドがあります。

メソッドから返されたオブジェクトを使用して、プロパティFixedDocumentから返すオブジェクトを作成したいと考えています。SourceDocumentPageGetPage

FixedDocument印刷前にファイルにプレビューを作成したいので、ソース プロパティから返される必要があります。

ReportPreviewerWindow window = new ReportPreviewerWindow();
window.previewer.Document = new ReportPaginator(printedSurface.ModelReport).Source;
window.ShowDialog();

プレビューアはDocumentViewerオブジェクトがReportPreviewerWindow

<Window x:Class="TanmiaGrp.Report.Designer.ReportPreviewerWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Report Previewer" >
   <Grid>
      <DocumentViewer x:Name="previewer"/>
   </Grid>
</Window>
4

1 に答える 1

0

この質問をした後、何かが私にとって非常に正しく機能することがわかりました。上記のような問題がある場合は、このリンクを参照してください

DocumentPaginator を使用して印刷するときにプレビューを印刷する方法は?

于 2015-01-02T13:26:07.690 に答える