WPF-документ с другим размером первой страницы - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть flowdocument с повторяющимся верхним / нижним колонтитулом, который создается с помощью пользовательского DocumentPaginator. Проблема в том, что мне нужен другой размер заголовка для первой страницы или, другими словами, мне нужен другой PagePadding для первой страницы. DocumentPaginator с повторяющимся верхним / нижним колонтитулом было описано много раз (например, здесь или здесь ), но никогда (?) Для заголовков разного размера (очень похоже вопрос без ответа). Мой фрагмент кода:

public class ReportPaginator : DocumentPaginator
{
    private DocumentPaginator _flowDocumentpaginator;
    private readonly FlowDocument _flowDocument;
    public ReportPaginator(FlowDocument document)
    {
        _flowDocumentpaginator = ((IDocumentPaginatorSource)document).DocumentPaginator;
        _flowDocument = document;
    }

    public override DocumentPage GetPage(int pageNumber)
    {
        DocumentPage page = _flowDocumentpaginator.GetPage(pageNumber);
        ContainerVisual newVisual = new ContainerVisual();
        DrawingVisual header = new DrawingVisual();
        if (pageNumber == 0)
        {
            //smaller header
            [...]
        }
        else
        {
            //normal header 
            [...]
        }
        newVisual.Children.Add(header);

        if (pageNumber == 0)
        {
            //set different margins for the first page
            _flowDocument.PagePadding = new Thickness(0.7 * 96, 93.2, 0.7 * 96, 74);
            _flowDocumentpaginator = ((IDocumentPaginatorSource)_flowDocument).DocumentPaginator;
            page = _flowDocumentpaginator.GetPage(pageNumber);
        }
        else if (pageNumber == 1)
        {
            //set "normal" margins for other pages
            _flowDocument.PagePadding = new Thickness(0.7 * 96, 180, 0.7 * 96, 74);
            _flowDocumentpaginator = ((IDocumentPaginatorSource)_flowDocument).DocumentPaginator;
            page = _flowDocumentpaginator.GetPage(pageNumber);
        }

        newVisual.Children.Add(page.Visual);

        DrawingVisual footer = new DrawingVisual();
        [...]
        newVisual.Children.Add(footer);

        return new DocumentPage(newVisual, page.Size, page.BleedBox, page.ContentBox);
    }
}

Этот код создает страницы правильного размера (первая больше других), но разбиение на страницы разбито: несколько строк в нижней части первой страницы повторяются в верхней частивторая страница, потому что пагинация пересчитывается после изменения PagePadding.

...