WPF PrintPreview获取DocumentPaginator页面的页面内容

我想使用DocumentViewer为更大的文本编写自己的PrintPreview,以便以后显示。 我没有找到对我的问题有用的东西。

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

使用代码:

  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插入到具有许多固定页数(取决于页数)的固定文档中?

iCMS 回答:WPF PrintPreview获取DocumentPaginator页面的页面内容

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

回答问题已有很长时间了。
我尝试了杜达(Doo Dah)的答案,但问题是它没有处理flowdocument的页面填充。

因此,我编写了自己的解决方案(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,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变量以从我的预览窗口调用方法,并可以传递当前的打印机设置。

如果从主程序调用它,则可以传递new PrintDialog()null,没有区别,因为如果传递new PrintDialog,它将创建一个null

这对使用带有不同类型的文本(标题,文本,字体)的Flowdocument来说对我来说很好。

它应该使用混合了图片和文字的图片,也可以只使用图片-使用视觉效果,而不是流程文档中的特定内容,因此它也应该使用分页符。

我没有尝试使用Shahin Dohan的答案,因为它经常遇到相同的问题。
它是用MVVM编写的,很难理解别人是何时写的。
在我看来,最好编写一个没有mvvm的小示例程序,人们可以将其熟练地应用于mvvm或仅使用代码。
我了解mvvm的机会,但向某人展示如何工作的方法,我只会看到缺点(如果您不会显示特定的mvvm机制)

本文链接:https://www.f2er.com/1742070.html

大家都在问