WPF WebView2中CoreWebView2_NewWindowRequested处理window.open页面不显示问题排查
解决WPF WebView2中NewWindowRequested事件子窗口不加载目标网页的问题
我帮你排查了代码里的几个关键问题,这就是子窗口没显示目标网页的原因,下面是修正方案:
1. 先修复HTML里的URL格式问题
你JS代码里的window.open参数末尾多了个空格,这会导致WebView2解析到错误的URL,先把这个空格去掉:
<script type="text/javascript"> function openPopup() { window.open("https://www.google.com"); } </script>
2. 修正NewWindowRequested事件的处理逻辑
你之前的写法没有遵循WebView2新窗口请求的标准处理流程,正确的做法是将我们创建的CoreWebView2实例绑定到事件参数的NewWindow属性,而不是手动设置Source。另外还要确保子窗口的WebView2控件能占满容器,避免因为尺寸问题看不到内容。
修改后的CoreWebView2_NewWindowRequested代码:
private async void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e) { var deferral = e.GetDeferral(); try { // 创建子窗口实例 var childWindow = new MainWindow(); childWindow.Title = "Child Window"; // 创建子窗口的WebView2控件 var childWebView2 = new WebView2(); // 设置控件填充整个父容器 childWebView2.HorizontalAlignment = HorizontalAlignment.Stretch; childWebView2.VerticalAlignment = VerticalAlignment.Stretch; childWindow.dockPanel.Children.Add(childWebView2); // 初始化CoreWebView2,并关联到事件的NewWindow属性 await childWebView2.EnsureCoreWebView2Async(null); e.NewWindow = childWebView2.CoreWebView2; // 标记事件已处理,阻止默认弹窗行为 e.Handled = true; childWindow.Show(); } finally { // 确保延迟操作总是完成,避免资源泄漏 deferral.Complete(); } }
额外优化:确保DockPanel能让WebView2占满窗口
如果你的MainWindow的dockPanel在XAML里没有设置LastChildFill="True",建议加上这个属性,这样WebView2会自动填满整个面板:
<DockPanel x:Name="dockPanel" LastChildFill="True"> <!-- 你的其他控件 --> </DockPanel>
关键修改点说明
- 用
e.NewWindow绑定CoreWebView2实例:这是WebView2处理新窗口请求的标准方式,它会自动将目标URL加载到这个实例中,不需要手动设置Source - 设置控件对齐方式:避免WebView2控件因为默认尺寸为0导致看不到内容
- try-finally包裹延迟操作:确保无论是否出现异常,
deferral.Complete()都会执行,防止资源泄漏
内容的提问来源于stack exchange,提问作者DotNetSpartan
相关产品推荐
相关产品推荐

