gpt4 book ai didi

c# - 如何将多个视觉元素作为一项任务批量打印?

转载 作者:行者123 更新时间:2023-11-30 17:04:26 25 4
gpt4 key购买 nike

我有多个 UserControl,每个代表一个页面,但我不知道如何打印它们,因为直到现在我只能打印一个 UserControl

下面是我如何打印单个 UserControl:

PrintDialog printDlg = new PrintDialog();
if (printDlg.ShowDialog() == true)
{
printDlg.PrintVisual((UserControl)myUserControl, "optionalname");
}

如何在一项任务中打印Visual 类型的多个对象?

最佳答案

经过更多研究,我发现以下 Blog有人试图在没有运气的情况下实现同样的事情,因为他有一些复制和过去的错别字。我修正了他的拼写错误,效果非常好。

这里是一个工作示例:

using System;
using System.Printing;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Xps;

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

List<UIElement> UC = new List<UIElement>();

for (int i = 0; i < 3; i++)
{
var uc = new UserControl
{
Background = Brushes.Red,
Content = new TextBlock
{
Text = "Box:" + i,
Margin = new Thickness(12),
Background = Brushes.Orange
}
};
UC.Add(uc);
}

var pDialog = new PrintDialog();

if (pDialog.ShowDialog() == true)
{
var xpsDocWriter = PrintQueue.CreateXpsDocumentWriter(pDialog.PrintQueue);
PrintUIElements(xpsDocWriter, UC);
}
}

/// <summary>
/// Used the XpsDocumentWriter to write a FixedDocumentSequence which contains the UIElements as single pages
/// </summary>
/// <param name="xpsWriter"></param>
/// <param name="uiElements"></param>
private void PrintUIElements(XpsDocumentWriter xpsWriter, List<UIElement> uiElements)
{
FixedDocumentSequence fixedDocSeq = new FixedDocumentSequence();

foreach (UIElement element in uiElements)
{
(fixedDocSeq as IAddChild).AddChild(toDocumentReference(element));

}

// write the FixedDocumentSequence as an XPS Document
xpsWriter.Write(fixedDocSeq);
}

/// <summary>
/// encapsulater for a UIElement in an DocumentReference
/// DocumentReference(FixedDocument(PageContent(FixedPage(UIElement))))
/// to simplify the print of multiple pages
/// </summary>
/// <param name="uiElement">the UIElement which</param>
/// <returns>creates a DocumentReference</returns>
private DocumentReference toDocumentReference(UIElement uiElement)
{
if (uiElement == null)
throw new NullReferenceException("the UIElement has to be not null");

FixedPage fixedPage = new FixedPage();
PageContent pageContent = new PageContent();
FixedDocument fixedDoc = new FixedDocument();
DocumentReference docRef = new DocumentReference();

#region Step1

// add the UIElement object the FixedPage
fixedPage.Children.Add(uiElement);

#endregion

#region Step2

// add the FixedPage to the PageContent collection
pageContent.BeginInit();
((IAddChild)pageContent).AddChild(fixedPage);
pageContent.EndInit();

#endregion

#region Step 3

// add the PageContent to the FixedDocument collection
((IAddChild)fixedDoc).AddChild(pageContent);

#endregion

#region Step 4

// add the FixedDocument to the document reference collection
docRef.BeginInit();
docRef.SetDocument(fixedDoc);
docRef.EndInit();

#endregion

return docRef;
}
}

编辑

上面的代码包含第一页的绑定(bind)错误,但我能够修复它。

/// <summary>
/// Used the XpsDocumentWriter to write a FixedDocument which get created and contains the UIElements as single pages
/// </summary>
/// <param name="xpsWriter">XpsDocumentWriter</param>
/// <param name="uiElements">List of UIElement</param>
private void PrintUIElements(XpsDocumentWriter xpsWriter, List<UIElement> uiElements)
{
var fixedDoc = new FixedDocument();

foreach (UIElement element in uiElements)
{
var fixedPage = new FixedPage();
var pageContent = new PageContent();

// add the UIElement object the FixedPage
fixedPage.Children.Add(element);

// add the FixedPage object the PageContent
pageContent.Child = fixedPage;

// add the PageContent object the FixedDocument
fixedDoc.Pages.Add(pageContent);
}

xpsWriter.Write(fixedDoc);
}

关于c# - 如何将多个视觉元素作为一项任务批量打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17471784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com