0

我想为更大的文本编写自己的 PrintPreview,并使用 aDocumentViewer稍后显示。我没有找到任何对我的问题有用的东西。

目前我正在寻找一种方法来获取各个页面的内容。我找到了一种访问各个页面的方法,但我无法存储或获取它。

使用代码:

  DocumentPaginator dpPages = (DocumentPaginator)((IDocumentPaginatorSource)twhtTemp.BuildTemplateControl(txtHeader, txtContent, pdlgPrint)).DocumentPaginator;
            dpPages.ComputePageCount();

            var fixedDocument = new FixedDocument();

            for (int iPages= 0; iPages < dpPages.PageCount; iPages++)
            {
                
                var pageContent = new PageContent();
                var fixedPage = new FixedPage();


                fixedPage.Width = pdlgPrint.PrintableAreaWidth;
                fixedPage.Height = pdlgPrint.PrintableAreaHeight;
                pageContent.Child = fixedPage;
                fixedDocument.Pages.Add(pageContent);
            }

我已经为每个现有页面添加了一个新页面,但我无法获取页面的内容。
到目前为止,我知道,我需要UIElement添加到fixedPage.Children.

还是有一些更简单的方法可以获取flowdocument具有许多固定页面的固定文档(取决于页数)?

4

1 回答 1

0

我讨厌它回答我自己的问题。
搜索三天后,我在这里问。
一天后,我找到了一个方法...

很久没有回答这个问题了。
我尝试了 Doo Dah 的回答,但问题是它没有处理流文档的页面填充。

因此,我编写了自己的解决方案(Doo Dah 的回答帮助我完成了它):

 public FixedDocument Get_Fixed_From_FlowDoc(FlowDocument flowDoc, PrintDialog printDlg)
{
           var fixedDocument = new FixedDocument();
            try
            {
                if (printDlg != null)
                {
                    pdlgPrint = printDlg;
                }

            if (pdlgPrint == null)
            {
                pdlgPrint = new PrintDialog();
            }

            DocumentPaginator dpPages = (DocumentPaginator)((IDocumentPaginatorSource)flowDoc).DocumentPaginator;
            dpPages.ComputePageCount();
            PrintCapabilities capabilities = pdlgPrint.PrintQueue.GetPrintCapabilities(pdlgPrint.PrintTicket);
           

            for (int iPages= 0; iPages < dpPages.PageCount; iPages++)
            {

                var page = dpPages.GetPage(iPages);
                var pageContent = new PageContent();
                var fixedPage = new FixedPage();


                Canvas canvas = new Canvas();

                VisualBrush vb = new VisualBrush(page.Visual);
                vb.Stretch = Stretch.None;
                vb.AlignmentX = AlignmentX.Left;
                vb.AlignmentY = AlignmentY.Top;
                vb.ViewboxUnits = BrushMappingMode.Absolute;
                vb.TileMode = TileMode.None;
                vb.Viewbox = new Rect(0, 0, capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);


                FixedPage.SetLeft(canvas, 0);
                FixedPage.SetTop(canvas, 0);
                canvas.Width = capabilities.PageImageableArea.ExtentWidth;
                canvas.Height = capabilities.PageImageableArea.ExtentHeight;
                canvas.Background = vb;

                fixedPage.Children.Add(canvas);

                fixedPage.Width = pdlgPrint.PrintableAreaWidth;
                fixedPage.Height = pdlgPrint.PrintableAreaHeight;
                pageContent.Child = fixedPage;
                fixedDocument.Pages.Add(pageContent);
            }
            dv1.ShowPageBorders = true;

        }
        catch (Exception)
        {
            throw;
        }
        return fixedDocument;
    }

您必须为之前将显示的内容构建一个 FlowDocument 并将其传递给方法。
添加了 PrintDialog 变量以从我的预览窗口调用方法,并且可以传递当前的打印机设置。

如果你从你的主程序中调用它,你可以传递 anew PrintDialog()null,没有区别,因为new PrintDialog如果你传递它会创建 anull

这对我来说很好用具有不同类型的文本(标题、文本、字体)的 Flowdocument .

它应该适用于混合的图片和文本,或者只适用于图片 - 它使用视觉效果而不是流文档中的特定内容,因此它也应该适用于分页符。

我没有尝试过 Shahin Dohan 的答案,因为它经常出现同样的问题。
它是在 MVVM 上编写的,当其他人编写它时很难理解。
在我看来,最好在没有 mvvm 的情况下编写一个小示例程序,人们可以熟练使用 mvvm 或仅使用代码。
我了解 mvvm 的机会,但是为了向某人展示如何工作,我只看到了缺点(如果您不展示特定的 mvvm 机制)

于 2020-08-16T00:32:25.473 回答