Разбивка на страницы FixedDocument с другим содержимым и заголовками не удалась - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь напечатать сетку WPF, содержащую несколько элементов, включая текстовые поля и две сетки данных. Поскольку он работает более чем на одной странице A4, я использовал метод FixedDocument для печати, перебирая сетку данных для каждой страницы и создавая различный заголовок для второй и последующих страниц. Однако используемый мной код, основанный на ответе на Разметка WPF FixedDocument , не создает, например, отдельные страницы 1, 2 и 3, а просто создает три копии последней страницы.

Я попытался повторно инициализировать все переменные PageContent и FrameWorkElement для каждой отдельной страницы, но все же последняя страница переопределяет каждую страницу, которая была добавлена ​​в FixedDocument ранее. Я нашел простой способ печати отдельных страниц на http://www.nbdtech.com/Blog/archive/2009/04/20/wpf-printing-part-2-the-fixed-document.aspx,, но если я пытаюсь добавить свою сетку, а не простое текстовое поле в качестве дочернего элемента FixedPage, я получаю «Указанный элемент уже является логическим дочерним элементом другого элемента ..." ошибка. Я также пытался печатать напрямую (а не через PrintPreview), используя printDialog.PrintDocument (fixedDoc.DocumentPaginator, «Нет предварительного просмотра») но получить тот же результат.

Вот фрагмент кода из моего метода Print:

    PrintDialog printDlg = new PrintDialog();
        printDlg.PrintTicket.PageOrientation = PageOrientation.Portrait;
        printDlg.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
        var toPrint = new FrameworkElement();
        toPrint = grdPrintingGrid;
        var capabilities = printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);
        var pageSize = new Size(printDlg.PrintableAreaWidth, printDlg.PrintableAreaHeight);
        var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
        var fixedDoc = new FixedDocument();
        //If the toPrint visual is not displayed on screen we neeed to measure and arrange it  
        toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize));
        //  
        var size = toPrint.DesiredSize;
        //Will assume for simplicity the control fits horizontally on the page  
        int numPages = 3;//TODO Will be calculated with reference to actual datagrid rows
        for (int i = 0; i < numPages; i++)
        {
            var pageContent = new PageContent();
            var page = new FixedPage();
            var canvas = new Canvas();
            if (i > 0) //Change headers and datagrid row selection for second and subsequent pages
            {
                SetHeaders(true);
                dgdExpenseTransactions.ItemsSource = testDataExpense.Skip(5).Take(10+(numPages*2)).ToList();//For demo only
                grdPrintingGrid.UpdateLayout();
                pageContent = new PageContent();
                page = new FixedPage();
                canvas = new Canvas();
            }
            toPrint = grdPrintingGrid;
            var vb = new VisualBrush(toPrint)
            {
                Stretch = Stretch.None,
                AlignmentX = AlignmentX.Left,
                AlignmentY = AlignmentY.Top,
                ViewboxUnits = BrushMappingMode.Absolute,
                TileMode = TileMode.None,
                Viewbox = new Rect(0, 0, visibleSize.Width, visibleSize.Height)
            };
            page.Width = pageSize.Width;
            page.Height = pageSize.Height;
            FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
            FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
            canvas.Width = visibleSize.Width;
            canvas.Height = visibleSize.Height;
            canvas.Background = vb;
            page.Children.Add(canvas);
            ((IAddChild)pageContent).AddChild(page);
            fixedDoc.Pages.Add(pageContent);
        }
        PDFPrintTest.PrintMethods.PrintHelper.ShowPrintPreview(fixedDoc);

Есть ли какой-нибудь способ добиться этой переменной разбивки на страницы, используя FixedDocuments для получения страниц, которые показывают различные части таблицы данных и заголовков, которые до сих пор ускользали от меня? Или просто FixedDocument не подходит для печати, когда требуются разные заголовки и содержимое страницы?

...