WPF 打印功能实现

在WPF中,打印功能的实现可以通过多种方式达成,下面为你详细介绍几种常见的实现方法。

方法一:使用PrintDialog进行打印

这种方法会弹出打印对话框,用户可以在对话框中设置打印参数。

实现思路
  1. 创建PrintDialog实例。
  2. 显示打印对话框,获取用户的打印设置。
  3. 若用户点击"确定",则执行打印操作。
示例代码
复制代码
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实例并显示对话框。
    • 若用户点击"确定",则创建FixedDocumentFixedPage,将需要打印的内容添加到FixedPage上。
    • 最后调用PrintDialogPrintDocument方法执行打印操作。
  • XAML代码
    • 创建一个按钮,点击按钮时触发PrintButton_Click事件。

方法二:无对话框直接打印

此方法无需弹出打印对话框,会直接使用默认打印机进行打印。

实现思路
  1. 获取默认打印机的PrintQueue
  2. 创建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事件。

以上两种方法可以满足不同场景下的打印需求,你可以根据实际情况进行选择。

相关推荐
码界奇点1 天前
基于eBPF技术的高性能网络防火墙系统设计与实现
开发语言·网络·毕业设计·php·wpf·go语言·源代码管理
cjp5601 天前
022.WPF 封装TextBox控件限制只输入数字自定义属性
wpf
cjp5601 天前
021.WPF 以MVVM模式控制combox控件显示/隐藏
wpf
小北方城市网2 天前
Redis 分布式锁高可用实现:从原理到生产级落地
java·前端·javascript·spring boot·redis·分布式·wpf
流水线上的指令侠2 天前
补充说明——针对《C#:从 0 到 1 创建基于 NUnit + FlaUI 的 WPF UI 自动化测试项目》
功能测试·ui·c#·自动化·wpf
流水线上的指令侠2 天前
C# 实战:从 0 到 1 搭建基于 NUnit + FlaUI 的 WPF UI 自动化测试项目
功能测试·ui·c#·自动化·wpf·visual studio
贾修行2 天前
.NET 全栈开发学习路线:从入门到分布式
c#·.net·wpf·asp.net core·web api·winforms·services
晓13132 天前
第四章:Redis实战应用及常见问题(下篇)
java·数据库·缓存·wpf
掘根3 天前
【jsonRpc项目】客户端的Requestor模块,RpcCaller模块
wpf
FuckPatience3 天前
WPF ListBoxItem绑定自己在ListBox中的顺序
wpf