You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改微软参考源码方法内单行代码解决WPF DocumentViewer打印PDF异常

解决方案

你的实现思路方向是正确的,但仅调用base.OnPrintCommand()没有意义,因为基类方法内部仍然会使用XpsDocumentWriter.WriteAsync执行异步打印逻辑,不会触发你需要的同步修改。你不需要修改微软底层源码,只要在重写的方法内自行实现完整的打印流程,将异步写入替换为同步写入即可。

完整实现代码

public class MyDocumentViewer : DocumentViewer
{
    protected override void OnPrintCommand()
    {
        // 不调用基类的打印方法,自行实现打印逻辑
        var printDialog = new PrintDialog();
        if (printDialog.ShowDialog() != true)
        {
            return;
        }

        // 获取当前要打印的文档
        var document = this.Document as IDocumentPaginatorSource;
        if (document == null)
        {
            return;
        }

        // 创建Xps文档写入器
        var xpsWriter = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);
        // 核心修改:使用同步Write方法代替原基类内部的异步WriteAsync方法
        xpsWriter.Write(document.DocumentPaginator, printDialog.PrintTicket);
    }
}

注意事项

  • 同步打印会阻塞UI线程,如果你的文档页数较多,建议自行添加加载提示避免用户误以为程序卡死
  • 该实现保留了默认的打印弹窗交互逻辑,和原有DocumentViewer的使用体验完全一致

内容的提问来源于stack exchange,提问作者Udineska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:09:03