VSTO插件中WebView2按钮启动空白页问题求助
问题解决:VSTO插件中WebView2空白页面无法加载的修复
问题根源
- 事件绑定时机错误:原代码在
await webView.EnsureCoreWebView2Async(env)之后才绑定CoreWebView2InitializationCompleted事件,此时WebView2初始化已完成,事件已触发过,导致无法收到回调。 - 异步初始化时机不当:在UserControl构造函数中直接调用
async void方法,控件生命周期未完全就绪,可能引发异步操作异常或未执行完成。
修复后的代码
BrowserUserControl.cs 完整代码
using Microsoft.Web.WebView2.Core; using System; using System.Windows.Forms; using Microsoft.Web.WebView2.WinForms; using System.Diagnostics; namespace My_Addin { public partial class BrowserUserControl : UserControl { private WebView2 webView; public BrowserUserControl() { InitializeComponent(); // 绑定控件加载事件,确保控件初始化完成后再启动WebView2初始化 this.Load += BrowserUserControl_Load; } private async void BrowserUserControl_Load(object sender, EventArgs e) { await InitializeAsync(); } private void WebView_NavigationStarting(object sender, CoreWebView2NavigationStartingEventArgs e) { Debug.WriteLine("inside WebView_NavigationStarting"); } private async Task InitializeAsync() { try { // 创建WebView2环境,使用默认Edge运行时,指定用户数据目录 var env = await CoreWebView2Environment.CreateAsync( browserExecutableFolder: null, userDataFolder: @"C:\Users\softtimur\VSTO"); Debug.WriteLine("inside InitializeAsync 1"); webView = new WebView2 { Dock = DockStyle.Fill, }; // 先绑定所有事件,再执行初始化操作 webView.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; webView.NavigationStarting += WebView_NavigationStarting; Controls.Add(webView); await webView.EnsureCoreWebView2Async(env); Debug.WriteLine("inside InitializeAsync 2"); } catch (Exception ex) { Debug.WriteLine($"Initialization failed with exception: {ex}"); MessageBox.Show($"WebView2初始化失败: {ex.Message}"); } } private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) { Debug.WriteLine("inside WebView_CoreWebView2InitializationCompleted 1"); if (e.IsSuccess) { Debug.WriteLine("inside WebView_CoreWebView2InitializationCompleted 2"); webView.CoreWebView2.Navigate("https://www.google.fr"); } else { MessageBox.Show($"WebView2初始化失败. 错误: {e.InitializationException.Message}"); } } } }
按钮点击事件代码(可保留原逻辑)
private void button2_Click(object sender, RibbonControlEventArgs e) { using (var form = new Form()) { form.Controls.Add(new BrowserUserControl { Dock = DockStyle.Fill }); form.ShowDialog(); } }
额外注意事项
- 确保已安装Microsoft Edge WebView2 Runtime,可通过Edge浏览器自带的运行时,或手动部署到插件目录。
- 如果使用自定义运行时路径,需在
CoreWebView2Environment.CreateAsync的browserExecutableFolder参数中指定Edge运行时的exe路径。
内容的提问来源于stack exchange,提问作者SoftTimur
相关产品推荐
相关产品推荐

