WebView2
开发专题 · 在 WinForms 窗体中嵌入基于 Edge 的浏览器控件
本页说明如何在 .NET Framework 窗体项目中使用官方 Microsoft.Web.WebView2.WinForms.WebView2 控件:运行时前置、在 LCode 中引用与放置、常用属性/方法,以及最小导航示例。面向传统 WinForms;凡有代码均同时给出 C# 5.0 与 VB.NET。设计器文案以 LCode 中文界面为准。
前置条件
| 项 | 要求(以 LCode 实况为准) |
|---|---|
| 目标框架 | .NET Framework 4.6.2 或更高(建议 4.7.2 / 4.8;LCode 默认窗体模板为 4.8) |
| 本机 Runtime | 须安装 WebView2 Runtime(Evergreen)。Windows 7 / 8 / 8.1 请使用该系统支持的最后版本(通常 ≤ 109) |
| 控件类型 | Microsoft.Web.WebView2.WinForms.WebView2 |
| 程序集 | Microsoft.Web.WebView2.WinForms、Microsoft.Web.WebView2.Core(SDK 包 Microsoft.Web.WebView2,当前随 LCode 分发版本为 1.0.3967.48) |
| 原生加载器 | 输出目录须有对应架构的 WebView2Loader.dll(x86 / x64);工具箱首次拖放会由 LCode 写入工程并配置复制 |
| 操作系统 | Windows(Win32);过旧系统无法使用 WebView2 |
提示:SDK 与 Runtime 是两回事:SDK 程序集随工程编译;Runtime 装在用户机器上。缺 Runtime 时设计器仍可放置控件并编译,但运行时无法加载网页。
在 LCode 中添加 WebView2
LCode 已集成官方控件到窗体设计器工具箱,并支持首次拖放时把 SDK 复制进工程(vendoring)。
方式一:工具箱拖放(推荐)
- 按 窗体应用入门 建好「Windows 应用程序」项目,确认目标框架 ≥ 4.6.2。
- 双击主窗体,底部切到设计页签。
- 打开工具箱,在「Windows 窗体」相关分类中找到 WebView2 浏览器(通常排在「Web 浏览器」上方),拖到设计面。
- 首次拖放时,LCode 会:
- 将 SDK 复制到工程目录
packages\Microsoft.Web.WebView2.1.0.3967.48\(版本号以本机 LCode 自带为准); - 添加对
Microsoft.Web.WebView2.Core与Microsoft.Web.WebView2.WinForms的相对路径引用; - 配置
WebView2Loader.dll复制到输出目录,并导入WebView2.LCode.targets; - 可能弹出「WebView2 环境提示」(Runtime / 目标框架检查)。
- 将 SDK 复制到工程目录
- 在属性面板将控件
Name设为便于编码的名字(下文示例用webView21),按需设置Dock(如Fill)。
可移植性:请把工程内
packages\Microsoft.Web.WebView2.* 随项目一并拷贝或纳入版本管理;引用的 HintPath 应指向工程内相对路径,勿指向 LCode 安装目录。
方式二:代码 / 手工引用
若未使用拖放,可按 引用 DLL 手动添加程序集,再在代码中创建控件:
- 从 LCode 安装目录的
data\WebView2\lib\net462\取得Microsoft.Web.WebView2.Core.dll与Microsoft.Web.WebView2.WinForms.dll(或从已 vendoring 的工程packages复制整包)。 - 在项目中添加上述两程序集引用;将对应架构的
WebView2Loader.dll以 Content(链接)复制到输出目录根(文件名保持WebView2Loader.dll)。 - 在窗体构造函数(或
Load)中new WebView2()、Controls.Add,并调用下文初始化与导航代码。
常用属性
| 属性 | 类型 / 说明 |
|---|---|
Source |
Uri。设置或读取当前导航地址;赋值会触发导航(控件已初始化后) |
CoreWebView2 |
核心浏览器对象;在 EnsureCoreWebView2Async 完成前可能为 null |
ZoomFactor |
double。缩放比例,默认 1.0 |
DefaultBackgroundColor |
控件背景色(页面未铺满时可见) |
AllowExternalDrop |
是否允许向控件拖入外部文件 |
CreationProperties |
创建环境时的附加选项(用户数据目录、浏览器可执行文件路径等) |
Dock / Anchor |
标准 WinForms 布局属性;嵌入浏览器常用 Dock = Fill |
常用方法与事件
| 成员 | 说明 |
|---|---|
EnsureCoreWebView2Async |
异步初始化核心运行时;之后才可安全使用 CoreWebView2 |
CoreWebView2.Navigate(string) |
导航到指定 URL 或本地路径 URI |
CoreWebView2.NavigateToString(string) |
用 HTML 字符串作为页面内容加载 |
Reload / GoBack / GoForward |
刷新、后退、前进(亦可经 CoreWebView2) |
Stop |
停止当前导航 |
ExecuteScriptAsync |
在页面中执行 JavaScript,并异步返回结果字符串 |
CoreWebView2InitializationCompleted |
核心初始化完成事件;可在此设置额外选项后再导航 |
NavigationStarting / NavigationCompleted |
导航开始 / 完成;可用于拦截地址或更新状态栏 |
Dispose |
释放本机资源;关闭窗体前应确保控件随窗体正确释放 |
最小实例:初始化并 Navigate
假设设计器已放置 webView21。在窗体 Load(或构造函数末尾)中初始化核心,再导航。C# 使用 async void 仅作窗体事件入口;业务逻辑中请优先 async Task。
C#
using System;
using System.Windows.Forms;
using Microsoft.Web.WebView2.WinForms;
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private async void MainForm_Load(object sender, EventArgs e)
{
// 初始化核心;参数 null 表示使用默认环境
await webView21.EnsureCoreWebView2Async(null);
// 方式 A:CoreWebView2.Navigate
webView21.CoreWebView2.Navigate("https://www.example.com/");
// 方式 B(二选一):直接设 Source
// webView21.Source = new Uri("https://www.example.com/");
}
}
VB.NET
Imports System
Imports System.Windows.Forms
Imports Microsoft.Web.WebView2.WinForms
Public Class MainForm
Inherits Form
Public Sub New()
InitializeComponent()
End Sub
Private Async Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 初始化核心;参数 Nothing 表示使用默认环境
Await webView21.EnsureCoreWebView2Async(Nothing)
' 方式 A:CoreWebView2.Navigate
webView21.CoreWebView2.Navigate("https://www.example.com/")
' 方式 B(二选一):直接设 Source
' webView21.Source = New Uri("https://www.example.com/")
End Sub
End Class
提示:若在设计器中已把
Source 设为有效 URI,首次显示时也可能自动导航;代码中仍建议先 EnsureCoreWebView2Async,再访问 CoreWebView2 的其它 API。
注意事项
| 主题 | 说明 |
|---|---|
| UI 线程 | 创建、操作 WebView2 与订阅其事件应在 UI 线程进行。后台线程更新控件请用 Control.Invoke / BeginInvoke 切回 UI |
| 异步与分发 | EnsureCoreWebView2Async、ExecuteScriptAsync 等为异步;窗体关闭过程中勿再 await 未取消的导航/脚本,以免回调落到已释放控件 |
| 卸载与生命周期 | 关闭窗体时让控件随窗体 Dispose。若在代码中动态创建,关闭前从 Controls 移除并调用 Dispose,避免残留浏览器进程/用户数据目录占用 |
| 与 WinForms 关系 | WebView2 是 HWND 承载的原生控件,与普通 WinForms 子控件同样遵循父窗体句柄创建/销毁顺序;MDI 子窗体关闭时注意子窗体内的 WebView2 一并释放 |
| 架构匹配 | 工程平台目标(x86 / x64 / AnyCPU)须与复制的 WebView2Loader.dll 架构一致;AnyCPU 优先按进程实际位数部署对应 Loader |
| 用户数据目录 | 默认环境会写入用户数据目录;多实例同目录可能冲突。需要隔离时通过 CreationProperties 或自定义 CoreWebView2Environment 指定目录 |
| 与 IE WebBrowser | 工具箱中的「Web 浏览器」是旧 IE 内核控件;新项目请优先用「WebView2 浏览器」 |
相关阅读
- C# / VB.NET 窗体应用入门 — 创建窗体项目
- 引用 DLL — 手工添加程序集
- 运行与编译 — 输出目录与运行
- 异步、同步与多线程 — 异步与 UI 线程
- MDI 窗口模式 — 多文档子窗体生命周期