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

.NET MAUI(Mac Catalyst)HTML文档打印无响应求助

.NET MAUI Mac Catalyst 下 HTML 打印问题解决

在Mac Catalyst平台上,直接通过WebView里的JS调用window.print()确实不会有反应——这不是思路错了,而是MAUI 6.0的默认WebView实现没有绑定原生的打印处理逻辑,导致打印请求被静默忽略。

问题本质

Mac Catalyst上的MAUI WebView底层是WKWebView,当JS触发window.print()时,WKWebView会发出打印请求,但MAUI默认没有处理这个请求的回调,所以没有任何反馈。

两种可行解决方案

方案一:自定义WebView Handler,捕获原生打印请求

通过替换Mac Catalyst平台的WebView处理逻辑,监听WKWebView的打印事件,触发系统打印面板:

  1. 在项目的Platforms/MacCatalyst目录下创建WebViewPrintHandler.cs:
using Microsoft.Maui.Handlers;
using WebKit;
using AppKit;
using Foundation;

namespace YourAppNamespace.Platforms.MacCatalyst;

public class WebViewPrintHandler : WebViewHandler
{
    protected override void ConnectHandler(WKWebView platformView)
    {
        base.ConnectHandler(platformView);
        platformView.PrintDelegate = new WebViewPrintDelegate();
    }
}

public class WebViewPrintDelegate : WKPrintDelegate
{
    public override void DidStartJob(WKWebView webView, WKPrintJob job)
    {
        var printInfo = NSPrintInfo.SharedPrintInfo;
        printInfo.JobName = "HTML文档打印";
        var printPanel = NSPrintPanel.FromPrintInfo(printInfo);
        
        printPanel.BeginSheet(webView.Window, (result) =>
        {
            if (result == NSModalResponse.OK)
            {
                webView.PrintDocument(printInfo, null);
            }
        });
    }
}
  1. 在MauiProgram.cs里注册自定义Handler:
builder.ConfigureMauiHandlers(handlers =>
{
#if MACCATALYST
    handlers.AddHandler<IWebView, Platforms.MacCatalyst.WebViewPrintHandler>();
#endif
});

这样修改后,原来的JS代码不需要改动,点击按钮触发window.print()后会自动弹出系统打印面板。

方案二:JS通知MAUI端触发打印

放弃JS直接调用window.print(),改为通过消息通知MAUI,由MAUI主动触发原生打印:

  1. 修改JS代码,发送打印请求消息:
let printButton = document.querySelector('.print');
printButton.addEventListener('click', function () {
    try {
        window.chrome.webview.postMessage('print');
    } catch (e) {
        alert('打印错误');
    }
});
  1. 在MAUI的WebView中监听消息并处理打印:
    在XAML中给WebView添加事件:
<WebView x:Name="HtmlWebView" WebMessageReceived="OnWebMessageReceived" />

后台代码实现事件处理:

private void OnWebMessageReceived(object sender, WebMessageReceivedEventArgs e)
{
    if (e.Message == "print")
    {
#if MACCATALYST
        var webView = (WebKit.WKWebView)((WebView)sender).Handler.PlatformView;
        var printInfo = AppKit.NSPrintInfo.SharedPrintInfo;
        printInfo.JobName = "HTML文档打印";
        var printPanel = AppKit.NSPrintPanel.FromPrintInfo(printInfo);
        
        printPanel.BeginSheet(webView.Window, (result) =>
        {
            if (result == AppKit.NSModalResponse.OK)
            {
                webView.PrintDocument(printInfo, null);
            }
        });
#endif
    }
}

版本说明

你使用的MAUI 6.0版本确实存在这个默认不支持的情况,上述两种方案都可以解决问题,根据自己的代码习惯选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:05:26