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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:45:03