首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF PrintPreview获取DocumentPaginator页面的PageContent

WPF PrintPreview获取DocumentPaginator页面的PageContent
EN

Stack Overflow用户
提问于 2020-08-15 01:30:03
回答 1查看 188关注 0票数 0

我想为更大的文本编写我自己的PrintPreview,以后使用DocumentViewer来显示它。对于我的问题,我没有发现任何有用的东西。

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

使用代码:

代码语言:javascript
复制
  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转到有很多固定页面的固定文档(降级到页面计数)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-16 00:32:25

我讨厌回答我自己的问题。

在搜索了三天之后,我问这里。

一天后我找到了一个方法..。

这个问题已经很久没有回答了。

我尝试了Doo的答案,但问题是它没有处理流文档的页面填充。

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

代码语言:javascript
复制
 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变量,以便从预览窗口调用该方法,并可以传递当前的打印机设置。

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

对于我来说,使用不同类型的文本(头、文本、字体)的Flowdocument可以很好地工作。

它应该处理图片和文本混合,或者只使用图片-它使用的是视觉,而不是特定的东西从一个流程文件,因此,它也应该处理分页。

我没有试过Shahin的回答,因为它和很多时候都是同一个问题。

它是在MVVM上编写的,当另一个人编写了它时,很难理解它。

在我看来,最好是编写一个没有mvvm的小示例程序,人们可以熟悉mvvm,或者只使用代码。

我理解mvvm的机会,但要向某人展示如何工作,我只看到一些缺点(如果您不向特定的mvvm机械师展示的话)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63421763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档