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对象以使用从方法返回的对象从Source属性中返回它。DocumentPageGetPage

我需要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 回答