根据 Microsoft 在 Windows 窗体中开始使用 webView2(截至 2021 年 3 月 9 日),我得到了以下代码(未设置 webView2.source;从 Form.Designer.cs 中编辑):
public Form1() {
InitializeComponent();
InitializeAsync();
}
async void InitializeAsync() {
Console.WriteLine("InitializeAsync starting");
await webView2.EnsureCoreWebView2Async(null);
Console.WriteLine("InitializeAsync done");
}
private void Form1_Load(object sender, EventArgs e) {
Console.WriteLine("Load event");
}
private void webView2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) {
Console.WriteLine("CoreWebView2InitializationCompleted event");
if ((webView2 == null) || (webView2.CoreWebView2 == null))
Console.WriteLine("not ready");
webView2.NavigateToString(File.ReadAllText("index.html"));
}
我很惊讶在 NavigateToString() 处遇到异常:
System.InvalidOperationException
HResult=0x80131509
Message=The instance of CoreWebView2 is uninitialized and unable to complete this operation. See InitializeAsync.
Source=Microsoft.Web.WebView2.WinForms
StackTrace:
at Microsoft.Web.WebView2.WinForms.WebView2.VerifyInitializedGuard()
at Microsoft.Web.WebView2.WinForms.WebView2.NavigateToString(String htmlContent)
at webview2_base.Form1.webView2_CoreWebView2InitializationCompleted(Object sender, CoreWebView2InitializationCompletedEventArgs e) in E:\Visual Studio 2019\source\repos\explore\webview2_base\Form1.cs:line 37
at Microsoft.Web.WebView2.WinForms.WebView2.<InitCoreWebView2Async>d__13.MoveNext()
控制台输出为:
InitializeAsync starting
Load event
CoreWebView2InitializationCompleted event
Exception thrown: 'System.InvalidOperationException' in Microsoft.Web.WebView2.WinForms.dll
An exception of type 'System.InvalidOperationException' occurred in Microsoft.Web.WebView2.WinForms.dll but was not handled in user code
The instance of CoreWebView2 is uninitialized and unable to complete this operation. See InitializeAsync.
那是怎么回事?考虑到事件的标签,我本以为 CoreWebView2 会完成其初始化。
如果 Navigate 移至 InitializeAsync 中的“await”之后,该代码将起作用。我可能不理解“等待”,我认为它会延迟 Form 构造函数和 Load 事件的完成,直到 CoreWebView2 完成之后。
我想将 Navigate 放入 Form Load 事件处理程序中(但它在 CoreWebView2 准备好之前触发)。
我是否不明白某些事情,或者这里是否存在与 CoreWebView2 相关的错误,即使在“initializeComplete”事件已触发后也未初始化?
VS2019 16.9,Net 4.7.2,webview2版本91.0.823.0金丝雀
Update(2021-03-19):如果将“webView2.NavigateToString()”替换为“webView2.CoreWebView2.NavigateToString()”,则它可以工作。但考虑到事件名称,似乎两者都应该在此时起作用。