我使用FlowDocument 来实现诸如此类的简单打印功能。就像在窗口中以编程方式创建 XAML 一样,您可以将 XAML 元素添加到文档中。使用相同的布局控件(网格、堆栈面板等)来排列所有其他控件(文本段落、图像等),并且在打印 FlowDocument 时,它将根据各种因素“流入”到页面中例如在打印机对话框中选择的纸张尺寸。
免责声明:这是匆忙复制/粘贴的,但它应该让您了解它的工作原理!
// Show the print dialog
var dlg = new PrintDialog();
if (!dlg.ShowDialog().GetValueOrDefault())
{
// User cancelled
return;
}
// Create and initialise the FlowDocument
_doc = new FlowDocument();
_doc.FontFamily = new FontFamily("Arial");
_doc.FontSize = 14;
// Add a paragraph of text
var para = new Paragraph(new Run("My paragraph....."))
{
FontSize = 14,
Foreground = new SolidColorBrush(Colors.Black),
Margin = new Thickness(0,0,0,12)
};
_doc.Blocks.Add(para);
// Add an image
var para = new Paragraph();
var img = new Image
{
Source = bitmapSource,
HorizontalAlignment = HorizontalAlignment.Center,
Margin = new Thickness(0,0,0,12)
};
para.Inlines.Add(img);
_doc.Blocks.Add(para);
// Print
var documentPaginator = ((IDocumentPaginatorSource)_doc).DocumentPaginator;
dlg.PrintDocument(documentPaginator, "My print job");
在我的应用程序中,我将所有这些都封装在一个类中(因为我有几个地方需要打印功能)。该类在其构造函数中创建并初始化FlowDocument,并提供各种方法,如“AddParagraph()”、“AddImage()”,具有不同的重载来指定边距、字体、字体大小等。
最后的文档分页器位是我的实现的简化版本,但它可能足以满足您的需求。 (我创建了一个自定义文档分页器,可以在每个页面上设置页眉和页脚)。