Edge浏览器WebView2弹窗点击链接如何打开新Edge窗口
问题场景
基于Edge浏览器的WebView2控件做二次开发时,需要实现效果:WebView2承载的HTML页面中点击触发新窗口的链接时,直接打开独立的系统Edge窗口加载目标地址。
当前使用以下代码实现时,目标URL只会在当前WebView2所在窗口内打开,无法触发独立Edge窗口弹出:
private void webView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) { webView21.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested; } private void CoreWebView2_NewWindowRequested(object sender,CoreWebView2NewWindowRequestedEventArgs e) { e.NewWindow = (CoreWebView2)sender; }
故障原因
事件处理代码中e.NewWindow = (CoreWebView2)sender;逻辑的作用,是将所有新窗口请求的内容强制路由到当前触发事件的WebView2实例中加载,本质是拦截新窗口请求后让当前控件承载新页面内容,自然不会弹出独立的外部Edge窗口。
修复方案
- 移除原有给
e.NewWindow赋值当前WebView2实例的逻辑 - 拦截
NewWindowRequested事件后,提取事件携带的目标URL,通过系统进程启动逻辑调用Edge打开该地址 - 设置
e.Handled = true,告知WebView2该新窗口请求已被自定义逻辑处理,无需执行默认路由行为
修复后的可直接运行代码如下:
using System.Diagnostics; private void webView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) { // 增加初始化成功判断,避免初始化失败时空引用报错 if (e.IsSuccess) { webView21.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested; } } private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e) { // 标记事件已自定义处理,阻断WebView2默认新窗口逻辑 e.Handled = true; string targetUrl = e.Uri; // 调用系统默认关联浏览器打开(若系统默认浏览器为Edge则直接符合需求) Process.Start(new ProcessStartInfo(targetUrl) { UseShellExecute = true }); // 如果需要强制指定Edge打开、忽略系统默认浏览器设置,替换上面的Process.Start逻辑为以下代码即可 // string edgePath = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"; // Process.Start(edgePath, targetUrl); }
注意事项
UseShellExecute = true是调用系统默认浏览器的必要配置,部分.NET版本下该属性默认值为false,必须手动显式设置- 如果是WPF/WinForm跨线程场景,需要把进程启动逻辑调度到UI线程执行,避免抛出线程权限异常
- 不要同时给
e.NewWindow赋值和执行外部浏览器启动逻辑,二者逻辑冲突会导致行为不符合预期
内容的提问来源于stack exchange,提问作者v_b
相关产品推荐
相关产品推荐

