0

でプレビューしてから印刷できる XpsDocument を作成する Paginator を作成しようとしています。Web で見つけた次のコードがありますが、それがどのように機能するのかわかりません。

私が抱えている問題は、これをそのまま実行すると、ページが正常に生成されることです。データの実際の値を生成する OnRender() 内の行 (Random の後のすべての行) をコメントアウトすると、高さが約 1 行でテキストがないページが表示されますが、正しい長さのように見えます。「行番号」と「列 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