You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WebView2控件窗口加载时加载HTML字符串报错的解决方法咨询

这个问题我之前也碰到过!核心原因是WebView2的CoreWebView2实例在窗口初始化的早期阶段还没完成初始化——默认情况下,WebView2会延迟初始化这个核心对象,直到你主动触发它(比如设置Source属性或者调用EnsureCoreWebView2Async方法)。而你在Button_Click里能成功,是因为到用户点击按钮的时候,控件早就完成初始化了。

下面给你两种可行的解决方案,以及对应的更优方案推荐:

解决方案1:在Loaded事件中等待CoreWebView2初始化完成

把你的rootGrid_Loaded事件处理方法改成异步方法,先调用EnsureCoreWebView2Async等待初始化完成,再执行NavigateToString

private async void rootGrid_Loaded(object sender, RoutedEventArgs e)
{
    // 等待CoreWebView2完成初始化,传null使用默认运行环境
    await webView2.EnsureCoreWebView2Async(null);
    
    // 现在可以安全调用NavigateToString了
    webView2.NavigateToString("<html><body><h1>Hello from Loaded Event!</h1></body></html>");
}

解决方案2:订阅CoreWebView2初始化完成事件

如果你不想用异步等待,也可以订阅CoreWebView2InitializationCompleted事件,在初始化完成后再加载HTML字符串,还能顺便处理初始化失败的情况:

public MainWindow()
{
    InitializeComponent();
    
    // 订阅初始化完成事件
    webView2.CoreWebView2InitializationCompleted += WebView2_CoreWebView2InitializationCompleted;
    
    // 主动触发初始化(如果还没开始的话)
    _ = webView2.EnsureCoreWebView2Async(null);
}

private void WebView2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
    if (e.IsSuccess)
    {
        // 初始化成功,加载HTML字符串
        webView2.NavigateToString("<html><body><h1>Hello from Initialization Completed!</h1></body></html>");
    }
    else
    {
        // 处理初始化失败的异常
        MessageBox.Show($"WebView2初始化失败: {e.InitializationException.Message}");
    }
}

更优方案推荐

  • 如果只是单纯要在窗口加载时立刻加载HTML字符串,方案1更简洁直接,代码逻辑清晰,一步到位。
  • 如果你的场景需要在初始化完成后执行更多后续操作(比如注册JS交互脚本、设置页面权限等),方案2更灵活,能明确监听初始化状态,还能处理初始化失败的异常情况。

额外补充:如果你需要自定义WebView2的运行环境(比如指定使用的Edge浏览器版本、自定义用户数据文件夹),可以提前创建CoreWebView2Environment实例,传给EnsureCoreWebView2Async,示例如下:

var env = await CoreWebView2Environment.CreateAsync(@"C:\Path\To\Edge\Binary", @"C:\Path\To\UserData");
await webView2.EnsureCoreWebView2Async(env);

内容的提问来源于stack exchange,提问作者nam

火山引擎 最新活动