如何在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项目
- 新建一个
Windows Forms App项目(选.NET Framework或.NET都可以) - 方法一:通过工具箱添加
- 打开右侧工具箱,右键空白处选选择项,切换到
COM组件标签,找到并勾选Microsoft Edge WebView2 Control,点确定后控件就会出现在工具箱里,直接拖到窗体上就行。
- 打开右侧工具箱,右键空白处选选择项,切换到
- 方法二:通过NuGet安装(更推荐,版本可控)
- 右键项目→管理NuGet程序包,搜索
Microsoft.Web.WebView2,安装最新稳定版。安装完成后,WebView2会自动出现在工具箱里,直接拖拽使用。
- 右键项目→管理NuGet程序包,搜索
针对WPF项目
- 新建
WPF App项目 - 同样通过NuGet安装
Microsoft.Web.WebView2包 - 在XAML文件里添加命名空间:
xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf" - 在布局里插入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#方法。
- C#调JS:用
- 自定义初始化配置:比如设置用户数据文件夹、启用开发者工具:
// 创建自定义运行时环境 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




