WebBrowser 内嵌网页浏览器控件
WebBrowser 是一个内嵌到 WinForm 软件中的网页浏览器控件,基于本机安装的 IE 内核。通过设置 Url 属性即可加载并展示网页内容。
基本使用
拖拽 WebBrowser 到窗体后,设置 Url 属性或在代码中指定地址:
private void Form1_Load(object sender, EventArgs e)
{
this.webBrowser1.Url = new Uri("http://www.foxdevelop.com");
}Code language: JavaScript (javascript)
也可以直接导航到指定网址:
private void button1_Click(object sender, EventArgs e)
{
this.webBrowser1.Navigate("http://www.baidu.com");
}Code language: JavaScript (javascript)
常用属性
| 属性 | 说明 |
|---|---|
Url | 获取或设置当前加载的网页地址 |
DocumentText | 获取或设置当前页面的 HTML 内容 |
DocumentStream | 获取或设置当前页面的流数据 |
DocumentTitle | 获取当前网页的标题 |
Document | 获取当前页面的 HTML 文档对象 |
CanGoBack | 是否可后退 |
CanGoForward | 是否可前进 |
IsBusy | 是否正在加载页面 |
ReadyState | 当前加载状态 |
ScriptErrorsSuppressed | 是否禁止显示脚本错误弹窗 |
ScrollBarsEnabled | 是否显示滚动条 |
AllowWebBrowserDrop | 是否允许拖放文件到浏览器 |
WebBrowserShortcutsEnabled | 是否启用浏览器快捷键 |
this.webBrowser1.ScriptErrorsSuppressed = true; // 禁止脚本错误弹窗
this.webBrowser1.ScrollBarsEnabled = true;
this.webBrowser1.AllowWebBrowserDrop = false;
this.webBrowser1.WebBrowserShortcutsEnabled = true;Code language: JavaScript (javascript)
常用方法
| 方法 | 说明 |
|---|---|
Navigate(string) | 导航到指定 URL |
Navigate(Uri) | 导航到指定 Uri |
GoBack() | 后退 |
GoForward() | 前进 |
Refresh() | 刷新页面 |
Stop() | 停止加载 |
GoHome() | 回到主页 |
GoSearch() | 打开搜索页 |
ShowPageSetupDialog() | 显示页面设置对话框 |
ShowPrintDialog() | 显示打印对话框 |
ShowPrintPreviewDialog() | 显示打印预览对话框 |
ShowPropertiesDialog() | 显示属性对话框 |
ShowSaveAsDialog() | 显示另存为对话框 |
DocumentText | 直接写入 HTML 字符串 |
// 直接渲染 HTML
this.webBrowser1.DocumentText = "<html><body><h1>Hello World</h1></body></html>";
// 后退/前进
private void buttonBack_Click(object sender, EventArgs e)
{
if (this.webBrowser1.CanGoBack)
this.webBrowser1.GoBack();
}
private void buttonForward_Click(object sender, EventArgs e)
{
if (this.webBrowser1.CanGoForward)
this.webBrowser1.GoForward();
}
// 刷新
private void buttonRefresh_Click(object sender, EventArgs e)
{
this.webBrowser1.Refresh();
}Code language: JavaScript (javascript)
常用事件
| 事件 | 说明 |
|---|---|
Navigating | 开始导航前触发(可取消) |
Navigated | 导航完成、页面开始加载时触发 |
DocumentCompleted | 页面加载完成后触发 |
ProgressChanged | 加载进度改变时触发 |
DocumentTitleChanged | 页面标题改变时触发 |
StatusTextChanged | 状态栏文本改变时触发 |
NewWindow | 尝试打开新窗口时触发(可取消) |
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.Text = this.webBrowser1.DocumentTitle; // 将窗体标题设为网页标题
}
private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
if (e.MaximumProgress > 0)
{
int percent = (int)(e.CurrentProgress * 100 / e.MaximumProgress);
this.progressBar1.Value = percent;
}
}
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
// 可在此处拦截特定网址
if (e.Url.ToString().Contains("blocked"))
{
e.Cancel = true;
MessageBox.Show("该网址已被拦截");
}
}Code language: JavaScript (javascript)
C# 与 JavaScript 互操作
C# 调用 JavaScript:
private void buttonCallJs_Click(object sender, EventArgs e)
{
this.webBrowser1.Document.InvokeScript("alert", new object[] { "Hello from C#" });
}
// 调用页面中的自定义函数
this.webBrowser1.Document.InvokeScript("myFunction", new object[] { "参数1", "参数2" });Code language: JavaScript (javascript)
JavaScript 调用 C#:
// 将 C# 对象暴露给 JavaScript
[ComVisible(true)]
public class ScriptObject
{
public void ShowMessage(string msg)
{
MessageBox.Show("来自JS的消息:" + msg);
}
}
// 在窗体中注册
private void Form1_Load(object sender, EventArgs e)
{
this.webBrowser1.ObjectForScripting = new ScriptObject();
this.webBrowser1.Navigate("http://localhost/test.html");
}Code language: JavaScript (javascript)
<!-- 网页中的 JavaScript -->
<script>
function callCSharp() {
window.external.ShowMessage("Hello from JS");
}
</script>
<button onclick="callCSharp()">调用C#方法</button>Code language: HTML, XML (xml)
注意事项
- WebBrowser 基于 IE 内核(默认使用 IE7 渲染模式),即使系统安装了更高版本的 IE
- 如需使用更高版本 IE 渲染,需修改注册表:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
添加:你的程序名.exe = DWORD值
| 值 | 对应 IE 版本 |
|---|---|
11001 | IE11 |
10001 | IE10 |
9000 | IE9 |
8000 | IE8 |
7000 | IE7 |
- 如果需要在 WinForm 中使用现代浏览器引擎,建议使用 WebView2(基于 Chromium Edge),功能更强大且持续更新
ScriptErrorsSuppressed = true可避免频繁的脚本错误弹窗干扰用户体验
Previous: TreeView 树形结构控件
Next: 窗体基础操作