在WPF中如何打印带分页的视觉界面?

3

我有一个ScrollViewer,里面有非常“长”的内容。我编写了一个从DocumentPaginator继承的类,但我不知道如何为这个Visual的每个部分创建一个“框架”?我的意思是说,我该如何“查看”控件的下一页?我尝试过以下方法,但没有成功:

    public override DocumentPage GetPage(int pageNumber)
    {
        double left = pageNumber * pageSize.Width;
        Point pt = new Point(left, 0);

        visual.RenderTransform = Transform.Identity;
        visual.RenderTransform = new TranslateTransform(-left, 0);

        visual.Measure(pageSize);
        visual.Arrange(new Rect(visual.DesiredSize));

        DocumentPage page = new DocumentPage(visual);
        return page;
    }

使用这段代码,我得到了正确的第一页,第二页与第一页完全相同,而所有其他页面都是空白的。

1个回答

1

DocumentPaginator 是相当棘手的。以下是一些步骤,可以帮助我正确估计页面大小并确保没有空白页面:

重写两个属性 IsPageCountValidPageCount 如下:

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

并且

public override int PageCount
{
    get
    {
        if (pageCount == 0)
        {
            this.ComputePageCount();
        }
        return pageCount;
    }
}

使用私有函数ComputePageCount进行页面大小计算(根据指定的单个pageSize将页面分成精确的页数)。

所有页面计数功能的关键在于设置

IsPageCountValid = true

这将始终确保Paginator使用您重写的方法来计算页面计数。

可以通过设置DocumentPaginator.PageSize属性来指定单个页面大小。

考虑每个页面中的所有页眉/页脚。大多数空白/较少的页面是错误的PageCount计算结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接