为了完整起见,感谢 David Risney 的解释,我能够实现相同的目标。不幸的是,它没有包含任何代码,但我使用1.0.721-prerelease 和Microsoft.WebView2.FixedVersionRuntime.87.0.664.66.x64 实现了这一点:
程序.cs:
using System;
using System.Windows.Forms;
namespace TestApp1
{
static class Program
{
public static Microsoft.Web.WebView2.Core.CoreWebView2Environment WebView2Environment;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Form1.cs:
using System;
using System.Windows.Forms;
namespace TestApp1
{
public partial class Form1 : Form
{
public Microsoft.Web.WebView2.Core.CoreWebView2Deferral Deferral;
public Microsoft.Web.WebView2.Core.CoreWebView2NewWindowRequestedEventArgs Args;
public Form1()
{
InitializeComponent();
webView21.CoreWebView2InitializationCompleted += webView21_CoreWebView2InitializationCompleted_1;
}
private void CoreWebView2_NewWindowRequested(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NewWindowRequestedEventArgs e)
{
Form1 f = new Form1();
f.Args = e;
f.Deferral = e.GetDeferral();
f.Show();
}
private async void Form1_Load(object sender, EventArgs e)
{
if (Program.WebView2Environment == null)
Program.WebView2Environment = Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(@"C:\Users\Dragon\Downloads\Microsoft.WebView2.FixedVersionRuntime.87.0.664.66.x64", $@"C:\Users\Dragon\Desktop\Test{Guid.NewGuid()}").Result;
await webView21.EnsureCoreWebView2Async(Program.WebView2Environment);
webView21.Source = new Uri("http://www.google.com");
}
private void webView21_CoreWebView2InitializationCompleted_1(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
if (!e.IsSuccess) { MessageBox.Show($"{e.InitializationException}"); }
if (Deferral != null)
{
Args.NewWindow = webView21.CoreWebView2;
Deferral.Complete();
}
webView21.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
}
private void button1_Click(object sender, EventArgs e)
{
webView21.ExecuteScriptAsync($@"window.open('http://www.bing.com', '_blank');");
}
}
}
所以它的工作方式有点奇怪:要生成一个新窗口,您可以通过 JavaScript 使用 ExecuteScriptAsync 来实现。在这种情况下,我将打开一个新窗口到 bing.com。所以,这会打电话给CoreWebView2_NewWindowRequested。为了让事件通过并且代码可以工作(否则它会冻结),它必须经历这一切。因此,您不能在当前正在发生的事件中设置 CoreWebView2NewWindowRequestedEventArgs 的 NewWindow 属性。
解决方案是将事件数据(args 和 deferral)带到新表单中,显示它,并在加载和 之后 控件的 CoreWebView2 属性不为空 / 已初始化,通过调用CoreWebView2InitializationCompleted,检查args/deferral 是否不为null,然后将defer 调用为Complete()(这基本上就像一个JS 承诺)AND 在这里你可以设置NewWindow 属性因为CoreWebView2 已经初始化,所以它不为空。
希望这将回答您的问题和未来的读者。有了这段代码,我就可以让它工作了。