WPF 打印功能实现
在WPF中,打印功能的实现可以通过多种方式达成,下面为你详细介绍几种常见的实现方法。
方法一:使用PrintDialog
进行打印
这种方法会弹出打印对话框,用户可以在对话框中设置打印参数。
实现思路
- 创建
PrintDialog
实例。 - 显示打印对话框,获取用户的打印设置。
- 若用户点击“确定”,则执行打印操作。
示例代码
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace WpfPrintExample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void PrintButton_Click(object sender, RoutedEventArgs e)
{
// 创建 PrintDialog 实例
PrintDialog printDialog = new PrintDialog();
// 显示打印对话框
if (printDialog.ShowDialog() == true)
{
// 创建 FixedDocument 用于存储要打印的内容
FixedDocument fixedDoc = new FixedDocument();
// 创建一个 FixedPage 作为打印页面
FixedPage fixedPage = new FixedPage();
// 创建一个 TextBlock 用于显示要打印的文本
TextBlock textBlock = new TextBlock();
textBlock.Text = "这是要打印的内容。";
fixedPage.Children.Add(textBlock);
// 创建一个 PageContent 并将 FixedPage 添加到其中
PageContent pageContent = new PageContent();
((IAddChild)pageContent).AddChild(fixedPage);
// 将 PageContent 添加到 FixedDocument 中
fixedDoc.Pages.Add(pageContent);
// 执行打印操作
printDialog.PrintDocument(fixedDoc.DocumentPaginator, "打印任务名称");
}
}
}
}
<Window x:Class="WpfPrintExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="打印" HorizontalAlignment="Left" Margin="222,162,0,0" VerticalAlignment="Top" Width="75" Click="PrintButton_Click"/>
</Grid>
</Window>
代码解释
- C#代码:
- 创建
PrintDialog
实例并显示对话框。 - 若用户点击“确定”,则创建
FixedDocument
和FixedPage
,将需要打印的内容添加到FixedPage
上。 - 最后调用
PrintDialog
的PrintDocument
方法执行打印操作。
- 创建
- XAML代码:
- 创建一个按钮,点击按钮时触发
PrintButton_Click
事件。
- 创建一个按钮,点击按钮时触发
方法二:无对话框直接打印
此方法无需弹出打印对话框,会直接使用默认打印机进行打印。
实现思路
- 获取默认打印机的
PrintQueue
。 - 创建
XpsDocumentWriter
并将文档内容写入。
示例代码
using System.Printing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace WpfPrintExample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void PrintWithoutDialogButton_Click(object sender, RoutedEventArgs e)
{
// 获取本地打印服务器
LocalPrintServer printServer = new LocalPrintServer();
// 获取默认打印机的打印队列
PrintQueue printQueue = printServer.DefaultPrintQueue;
using (printQueue)
{
// 创建 XpsDocumentWriter 用于写入打印内容
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printQueue);
// 创建 FixedDocument 用于存储要打印的内容
FixedDocument fixedDoc = new FixedDocument();
// 创建一个 FixedPage 作为打印页面
FixedPage fixedPage = new FixedPage();
// 创建一个 TextBlock 用于显示要打印的文本
TextBlock textBlock = new TextBlock();
textBlock.Text = "这是要打印的内容。";
fixedPage.Children.Add(textBlock);
// 创建一个 PageContent 并将 FixedPage 添加到其中
PageContent pageContent = new PageContent();
((IAddChild)pageContent).AddChild(fixedPage);
// 将 PageContent 添加到 FixedDocument 中
fixedDoc.Pages.Add(pageContent);
// 执行打印操作
writer.Write(fixedDoc);
}
}
}
}
<Window x:Class="WpfPrintExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="无对话框打印" HorizontalAlignment="Left" Margin="222,200,0,0" VerticalAlignment="Top" Width="120" Click="PrintWithoutDialogButton_Click"/>
</Grid>
</Window>
代码解释
- C#代码:
- 获取本地打印服务器和默认打印机的
PrintQueue
。 - 创建
XpsDocumentWriter
,将文档内容写入其中进行打印。
- 获取本地打印服务器和默认打印机的
- XAML代码:
- 创建一个按钮,点击按钮时触发
PrintWithoutDialogButton_Click
事件。
- 创建一个按钮,点击按钮时触发
以上两种方法可以满足不同场景下的打印需求,你可以根据实际情况进行选择。