.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的打印事件,触发系统打印面板:
- 在项目的
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); } }); } }
- 在
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主动触发原生打印:
- 修改JS代码,发送打印请求消息:
let printButton = document.querySelector('.print'); printButton.addEventListener('click', function () { try { window.chrome.webview.postMessage('print'); } catch (e) { alert('打印错误'); } });
- 在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
相关产品推荐
相关产品推荐

