0

我正在尝试创建一个 Paginator,它将反过来创建一个 XpsDocument,我可以使用它进行预览然后打印。我在网上找到了以下代码,但不明白它是如何工作的。

我遇到的问题是,如果我按原样运行,页面会成功生成。如果我注释掉 OnRender() 中生成数据实际值的行(Random...之后的所有行),我会得到大约一行高的页面,并且上面没有文本,但它们似乎是正确的长度。是什么阻止了“行号”和“列 i”的值显示?

我已经包含了 2 个屏幕截图来说明。

public class TaxCodePrintPaginator : DocumentPaginator
{
    private int _RowsPerPage;
    private Size _PageSize;
    private int _Rows;
    private List<TaxCode> _dataList;

    public TaxCodePrintPaginator(List<TaxCode> dt, int rows, Size pageSize)
    {
        _dataList = dt;
        _Rows = rows;
        PageSize = pageSize;
    }

    public override DocumentPage GetPage(int pageNumber)
    {
        int currentRow = _RowsPerPage * pageNumber;
        var page = new PageElement(currentRow, Math.Min(_RowsPerPage, _Rows - currentRow))
        {
            Width = PageSize.Width,
            Height = PageSize.Height
        };

        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(_Rows / (double)_RowsPerPage); } }

    public override Size PageSize
    {
        get { return _PageSize; }
        set
        {
            _PageSize = value;

            _RowsPerPage = 40;

            //Can't print anything if you can't fit a row on a page
            Debug.Assert(_RowsPerPage > 0);
        }
    }

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


public class PageElement : UserControl
{
    private const int PageMargin = 75;
    private const int HeaderHeight = 25;
    private const int LineHeight = 20;
    private const int ColumnWidth = 140;

    private int _CurrentRow;
    private int _Rows;

    public PageElement(int currentRow, int rows)
    {
        Margin = new Thickness(PageMargin);
        _CurrentRow = currentRow;
        _Rows = rows;
    }

    private static FormattedText MakeText(string text)
    {
        return new FormattedText(text, CultureInfo.CurrentCulture,
          FlowDirection.LeftToRight,
          new Typeface("Tahoma"), 14, Brushes.Black);
    }

    public static int RowsPerPage(double height)
    {
        return (int)Math.Floor((height - (2 * PageMargin)
          - HeaderHeight) / LineHeight);
    }

    protected override void OnRender(DrawingContext dc)
    {

        Point curPoint = new Point(0, 0);
        dc.DrawText(MakeText("Row Number"), curPoint);


        curPoint.X += ColumnWidth;
        for (int i = 1; i < 4; i++)
        {
            dc.DrawText(MakeText("Column " + i), curPoint);
            curPoint.X += ColumnWidth;
        }

        curPoint.X = 0;
        curPoint.Y += LineHeight;

        dc.DrawRectangle(Brushes.Black, null, new Rect(curPoint, new Size(Width, 2)));
        curPoint.Y += HeaderHeight - LineHeight;

        Random numberGen = new Random();
        for (int i = _CurrentRow; i < _CurrentRow + _Rows; i++)
        {
            dc.DrawText(MakeText(i.ToString()), curPoint);
            curPoint.X += ColumnWidth;
            for (int j = 1; j < 4; j++)
            {
                dc.DrawText(MakeText(numberGen.Next().ToString()), curPoint);
                curPoint.X += ColumnWidth;
            }
            curPoint.Y += LineHeight;
            curPoint.X = 0;
        }
    }
}

在注释掉代码行之前

在注释掉代码行之后

4

0 回答 0