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

如何在C# Windows应用及Visual Studio中使用Microsoft Edge WebView2控件

在C# Windows应用中使用Microsoft Edge WebView2控件(Visual Studio环境)

嘿,我来一步步教你搞定在C# Windows应用里用WebView2控件的事儿——这玩意儿现在做桌面内嵌网页、混合应用太实用了!下面从准备工作到具体代码实现,全给你捋清楚。

一、先搞定准备工作

  • Visual Studio版本:确保你用的是2019 16.9及以上版本,要是版本稍低,也得装上.NET桌面开发工作负载,不然可能找不到控件。
  • WebView2 Runtime:必须装这个!推荐装Evergreen Runtime,它会自动更新,省得你手动维护版本;要是需要固定版本,也可以下载Fixed Version的Runtime。
  • 项目框架要求:你的项目得是.NET Framework 4.6.2+ 或者 .NET 5/6/7+,低版本框架不支持WebView2。

二、在Visual Studio里添加WebView2控件

分WinForms和WPF两种最常见的Windows应用类型来说:

针对WinForms项目

  1. 新建一个Windows Forms App项目(选.NET Framework或.NET都可以)
  2. 方法一:通过工具箱添加
    • 打开右侧工具箱,右键空白处选选择项,切换到COM组件标签,找到并勾选Microsoft Edge WebView2 Control,点确定后控件就会出现在工具箱里,直接拖到窗体上就行。
  3. 方法二:通过NuGet安装(更推荐,版本可控)
    • 右键项目→管理NuGet程序包,搜索Microsoft.Web.WebView2,安装最新稳定版。安装完成后,WebView2会自动出现在工具箱里,直接拖拽使用。

针对WPF项目

  1. 新建WPF App项目
  2. 同样通过NuGet安装Microsoft.Web.WebView2
  3. 在XAML文件里添加命名空间:
    xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
    
  4. 在布局里插入WebView2控件:
    <wv2:WebView2 x:Name="webView" Width="800" Height="600" />
    

三、初始化并使用WebView2

不管是WinForms还是WPF,WebView2都需要先初始化运行时环境才能用,直接上代码示例:

WinForms代码示例

using Microsoft.Web.WebView2.Core;
using System;
using System.Windows.Forms;

namespace WebView2WinFormsDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 窗体加载时初始化WebView2
            InitializeWebView2();
        }

        private async void InitializeWebView2()
        {
            // 用Evergreen Runtime的话,第二个参数传null就行;要是用Fixed Version,这里填Runtime的路径
            await webView21.EnsureCoreWebView2Async(null);

            // 加载你想要的网页,比如百度
            webView21.CoreWebView2.Navigate("https://www.baidu.com");

            // 注册导航完成事件,方便做后续操作
            webView21.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted;
        }

        private void CoreWebView2_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
        {
            MessageBox.Show($"页面加载完成啦,状态:{(e.IsSuccess ? "成功" : "失败")}");
        }
    }
}

WPF代码示例

using Microsoft.Web.WebView2.Core;
using System;
using System.Windows;

namespace WebView2WpfDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            InitializeWebView2();
        }

        private async void InitializeWebView2()
        {
            await webView.EnsureCoreWebView2Async(null);
            webView.CoreWebView2.Navigate("https://www.baidu.com");

            // 给JS暴露一个C#对象,实现双向交互
            webView.CoreWebView2.AddHostObjectToScript("desktopApp", new WebView2HostObject());
        }
    }

    // 要给JS调用的类,必须标记为ComVisible
    [System.Runtime.InteropServices.ComVisible(true)]
    public class WebView2HostObject
    {
        public void ShowDesktopMessage(string message)
        {
            MessageBox.Show($"来自网页的消息:{message}");
        }
    }
}

四、实用技巧补充

  • C#和JS双向交互
    • C#调JS:用ExecuteScriptAsync方法,比如获取页面标题:
      string pageTitle = await webView.CoreWebView2.ExecuteScriptAsync("document.title");
      MessageBox.Show($"当前页面标题:{pageTitle}");
      
    • JS调C#:就是上面WPF示例里的AddHostObjectToScript,JS里可以通过window.chrome.webview.hostObjects.desktopApp.ShowDesktopMessage('Hello')调用C#方法。
  • 自定义初始化配置:比如设置用户数据文件夹、启用开发者工具:
    // 创建自定义运行时环境
    var env = await CoreWebView2Environment.CreateAsync(null, @"C:\MyWebView2UserData");
    await webView.EnsureCoreWebView2Async(env);
    // 开启开发者工具(按F12就能调出来)
    webView.CoreWebView2.Settings.AreDevToolsEnabled = true;
    
  • 拦截导航行为:通过NavigationStarting事件可以拦截跳转,比如禁止打开外部链接:
    webView.CoreWebView2.NavigationStarting += (sender, e) => {
        if (!e.Uri.StartsWith("https://myapp.com"))
        {
            e.Cancel = true;
            MessageBox.Show("禁止访问外部链接!");
        }
    };
    

五、常见坑点排查

  • 控件显示空白:先检查WebView2 Runtime有没有装,再确认EnsureCoreWebView2Async是否执行完成(必须等初始化完成再调用导航等操作)。
  • NuGet包版本问题:尽量用最新稳定版的Microsoft.Web.WebView2,和Runtime版本保持兼容。
  • .NET Framework项目报错:确保目标框架是4.6.2及以上,低版本不支持WebView2的异步API。

内容的提问来源于stack exchange,提问作者Prasad-yadav

火山引擎 最新活动