【问题标题】:How to print multiple WPF pages in one document如何在一个文档中打印多个 WPF 页面
【发布时间】:2012-04-25 16:57:23
【问题描述】:

我想创建一个包含多个页面的文档,并且每个页面上都显示一个 wpf 窗口。

我设法使用 PrintDialog 和 PrintVisual 打印了一个窗口。然而,这似乎只适用于一页?任何想法如何构建包含多页的文档并打印完整集。

我可以插入该视觉对象(在代码中引用)并将其作为页面插入到文档中,然后再打印吗?

方法真的很糟糕吗?有没有其他方法可以解决这个问题?

      Sub Print (Dim ele As FrameWorkElement)
            Dim margin As Double = 30
            Dim titlePadding As Double = 10

            Dim printDlg As PrintDialog = New PrintDialog()
            printDlg.PrintTicket.PageOrientation = PageOrientation.Landscape
            If (printDlg.ShowDialog() <> True) Then Return

            Dim formattedText As FormattedText = New FormattedText(Name, CultureInfo.GetCultureInfo("en-us"),
                                                            FlowDirection.LeftToRight, New Typeface("Verdana"), 25, Brushes.Black)

            formattedText.MaxTextWidth = printDlg.PrintableAreaWidth

            Dim scale As Double = Math.Min(printDlg.PrintableAreaWidth / (ele.ActualWidth + (Margin * 2)),
                                    (printDlg.PrintableAreaHeight - (formattedText.Height + titlePadding)) / (ele.ActualHeight + (Margin * 2)))

            Dim visual As DrawingVisual = New DrawingVisual()
            Using context As DrawingContext = visual.RenderOpen()

                Dim brush As VisualBrush = New VisualBrush(ele)
                context.DrawRectangle(brush, Nothing, New Rect(New Point(margin, margin + formattedText.Height + titlePadding),
                                                            New Size(ele.ActualWidth, ele.ActualHeight)))

                context.DrawText(formattedText, New Point(margin, margin))
            End Using
            visual.Transform = New ScaleTransform(scale, scale)
            printDlg.PrintVisual(visual, "")
     End Sub

【问题讨论】:

    标签: wpf vb.net printing


    【解决方案1】:

    您想创建一个带有多个FixedPagesFixedDocument

    示例:

    如何创建新文档和单页。

    var pageSize = new Size(8.26 * 96, 11.69 * 96); // A4 page, at 96 dpi
    var document = new FixedDocument();
    document.DocumentPaginator.PageSize = pageSize;
    
    // Create FixedPage
    var fixedPage = new FixedPage();
    fixedPage.Width = pageSize.Width;
    fixedPage.Height = pageSize.Height;
    // Add visual, measure/arrange page.
    fixedPage.Children.Add((UIElement)visual);
    fixedPage.Measure(pageSize);
    fixedPage.Arrange(new Rect(new Point(), pageSize));
    fixedPage.UpdateLayout();
    
    // Add page to document
    var pageContent = new PageContent();
    ((IAddChild)pageContent).AddChild(fixedPage);
    document.Pages.Add(pageContent);
    
    // Send to the printer.
    var pd = new PrintDialog();
    pd.PrintDocument(document.DocumentPaginator, "My Document");
    

    用 C# 编写,但是您应该能够转换为 VB。

    HTH,

    【讨论】:

    • internalPage 应该引用什么?
    • @MichaelBromley,我已经更新了示例。这是一个复制/粘贴错误,internalPage 应该是 fixedPage
    • 啊,我猜是的。无论如何,我设法使用了您的代码(为自己找出错误),非常感谢!为我节省了很多时间来寻求更复杂的解决方案。
    • @MichaelBromley。不客气。几年前我第一次做这项工作时,我做了很多工作/调查。
    • 嗨@Dennis,我刚刚复制/粘贴了第 9 行的单词 visual(fixedPage.Children.Add((UIElement)visual)) 在 Visual Studio 中无法识别,您能帮帮我吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多