问题描述
在我的 WPF WebView2 控件中,我想从主窗口执行 window.open("https://www.google.com")
以使用 CoreWebView2_NewWindowRequested
在子窗口中打开 URL。但是 URL 网页没有显示在子窗口实例中。
我不太确定我下面的代码有什么问题:
MainWindow.xaml.cs
private async void btnopenPopup_Click(object sender,RoutedEventArgs e)
{
await MainWebView2Instance.ExecuteScriptAsync("openPopup()");
}
private async void CoreWebView2_NewWindowRequested(object sender,CoreWebView2NewWindowRequestedEventArgs e)
{
Microsoft.Web.WebView2.Core.CoreWebView2Deferral deferral = e.GetDeferral();
MainWindow childWindow = new MainWindow();
childWindow.Title = "Child Window";
//Creating a new webview2 instance for the child window
WebView2 childWebView2Instance = new WebView2();
await childWebView2Instance.EnsureCoreWebView2Async(null);
childWebView2Instance.source = new Uri(e.Uri);
childWindow.dockPanel.Children.Add(childWebView2Instance);
e.Handled = true;
deferral.Complete();
childWindow.Show();
}
HTML 页面中的 JavaScript
<script type="text/javascript">
function openPopup() {
window.open("https://www.google.com ");
}
</script>
解决方法
注释掉(或删除)以下行:
await childWebView2Instance.EnsureCoreWebView2Async(null);
——它正在阻塞。您没有使用 CoreWebView2Environment
,因此它的用法是不必要的。当您为 childWebView2Instance
设置 Source 属性时,它将隐式初始化 CoreWebView2。
更新:
当点击网页上的链接时,以下代码将打开一个子窗口,网页的 HTML 如下所示:
index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
</head>
<script>
function popuponclick()
{
my_window = window.open("https://www.google.com");
}
</script>
<body>
<div>
<a href="javascript: popuponclick()">Open Popup Window</A>
</div>
</body>
</html>
MainWindow.xaml
...
<wv2:WebView2
Name="webView21"
CoreWebView2InitializationCompleted="webView21_CoreWebView2InitializationCompleted"
Source="http://127.0.0.1:80/index.html"/>
...
webView21_CoreWebView2InitializationCompleted (MainWindow.xaml.cs)
private void webView21_CoreWebView2InitializationCompleted(object sender,Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
System.Diagnostics.Debug.WriteLine(this.Title + " - webView21_CoreWebView2InitializationCompleted");
webView21.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
}
向 MainWindow.xaml.cs 添加 using 语句:
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.Wpf;
在 MainWindow.xaml.cs
中,添加另一个可用于设置 WebView2 控件的 Source 属性的构造函数。它应该如下所示:
构造函数:(MainWindow.xaml.cs)
...
public MainWindow()
{
InitializeComponent();
}
public MainWindow(string url)
{
InitializeComponent();
webView21.Source = new Uri(url);
}
...
CoreWebView2_NewWindowRequested (MainWindow.xaml.cs)
private void CoreWebView2_NewWindowRequested(object sender,Microsoft.Web.WebView2.Core.CoreWebView2NewWindowRequestedEventArgs e)
{
CoreWebView2 cwv2 = (CoreWebView2)sender;
Microsoft.Web.WebView2.Core.CoreWebView2Deferral deferral = e.GetDeferral();
MainWindow childWindow = null;
childWindow = new MainWindow(e.Uri);
childWindow.Title = "Child Window";
childWindow.Show();
e.Handled = true;
deferral.Complete();
}