WPF使用WebView2触发NewWindowRequested覆盖现有窗口跳转空白页问题
问题原因
你遇到的异常表现是三个已知问题共同导致的:
- 你使用的1.0.902.49版本WebView2存在NewWindowRequested事件时序bug:事件处理被阻塞(比如断点命中)时,内部逻辑会强制把原WebView2的地址重写为
about:blank#blocked空白页 - 直接将
CoreWebView2NewWindowRequestedEventArgs.NewWindow赋值为现有CoreWebView2实例的逻辑本身错误:该属性要求传入新的未绑定的CoreWebView2实例,复用现有实例会直接触发原页面导航覆盖,同时不会生成新窗口 - 部分站点的PDF链接做了动态生成/跳转校验,直接读取事件参数的Uri属性无法拿到真实地址,只会返回blocked标识
解决方案
步骤1:升级WebView2版本
先将WebView2 SDK和运行时升级到1.0.1264.42及以上版本,该版本已经修复了调试阻塞导致原页面被覆盖的bug,同时优化了NewWindowRequested事件的参数返回逻辑,能拿到更多动态生成的跳转地址。
步骤2:修正新窗口请求处理逻辑
根据你的需求选择以下两种实现方案:
方案1:弹出自定义尺寸的新窗口打开PDF
该方案可以完全解决原新窗口不遵守尺寸设置的问题,代码示例:
private void WebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e) { e.Handled = true; // 标记事件已处理,阻止系统默认弹窗 // 初始化自定义尺寸的新窗口 var pdfWindow = new Window { Width = 900, // 自定义窗口宽度 Height = 700, // 自定义窗口高度 Title = "PDF预览", WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this // 绑定父窗口 }; var newWebView = new Microsoft.Web.WebView2.Wpf.WebView2(); pdfWindow.Content = newWebView; pdfWindow.Loaded += async (s, args) => { await newWebView.EnsureCoreWebView2Async(); // 将新WebView2的CoreWebView2实例赋值给事件参数,绑定跳转逻辑 e.NewWindow = newWebView.CoreWebView2; pdfWindow.Show(); }; }
方案2:在原窗口打开PDF(不需要新窗口)
如果不需要弹出新窗口,可以直接拦截跳转地址在原WebView2打开,代码示例:
private async void WebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e) { e.Handled = true; string targetUri = e.Uri; // 处理地址被blocked的情况,从当前点击的元素获取真实链接 if (targetUri.StartsWith("about:blank#blocked")) { var scriptResult = await webView2.CoreWebView2.ExecuteScriptAsync("document.activeElement.href"); targetUri = scriptResult.Trim('"'); } // 校验为PDF地址后发起导航 if (targetUri.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)) { webView2.CoreWebView2.Navigate(targetUri); } }
步骤3:无法获取真实PDF地址的处理方法
如果按照上述步骤还是拿不到真实PDF地址,可以做以下处理:
- 监听
CoreWebView2.NavigationStarting事件,所有跳转请求都会在该事件中抛出,即使是多层跳转的PDF地址也能拿到真实请求路径 - 若确认是跨域限制导致地址被拦截,可以添加权限配置放开限制:
await webView2.EnsureCoreWebView2Async(); // 放开自动下载、跨域访问权限 await webView2.CoreWebView2.Profile.SetPermissionStateAsync( "*", CoreWebView2PermissionKind.AutoDownloads, CoreWebView2PermissionState.Allow ); webView2.CoreWebView2.Settings.IsWebSecurityEnabled = false; // 调试用,生产环境建议按需配置
内容的提问来源于stack exchange,提问作者wingthor
相关产品推荐
相关产品推荐

