使用 WebView2 开发现代应用

WebView2 是 Microsoft 提供的一种嵌入式浏览器控件,基于 Edge (Chromium) 引擎。它允许开发者将现代 Web 技术(如 HTML、CSS 和 JavaScript)与桌面应用相结合,从而构建强大、灵活的用户界面。

本文将介绍 WebView2 的基本使用,并重点讲解以下几个重要功能:

  • NewWindowRequested
  • WebResourceResponseReceived
  • AddWebResourceRequestedFilter
  • WebResourceRequested

环境准备

  1. 安装 WebView2 Runtime: WebView2 需要运行时支持,用户设备必须安装 WebView2 Runtime。如果未安装,可以通过以下链接下载:WebView2 Runtime

  2. 引入必要的 NuGet 包: 在 Visual Studio 中,添加 Microsoft.Web.WebView2 NuGet 包。

  3. 初始化 WebView2: 创建 WebView2 控件并确保其已正确初始化。以下代码检查并安装 WebView2 Runtime:

private static async Task<bool> InitializeWebView2()
{
try
{
string version = CoreWebView2Environment.GetAvailableBrowserVersionString();
return !string.IsNullOrEmpty(version);
}
catch
{
// 引导用户安装 WebView2 Runtime
MessageBox.Show("WebView2 Runtime 未安装。请安装后重试。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}

创建 WebView2 控件

以下代码展示了如何创建 WebView2 控件并初始化其核心功能:

public static async Task<WebView2> CreateWebView()
{
if (!await InitializeWebView2())
{
return null;
} WebView2 webView2 = new WebView2
{
Dock = DockStyle.Fill
}; await webView2.EnsureCoreWebView2Async(null); // 注册事件
webView2.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
webView2.CoreWebView2.WebResourceResponseReceived += CoreWebView2_WebResourceResponseReceived; // 添加请求过滤器
webView2.CoreWebView2.AddWebResourceRequestedFilter("*://www.example.com/*", CoreWebView2WebResourceContext.Document);
webView2.CoreWebView2.WebResourceRequested += WebView2_WebResourceRequested; return webView2;
}

拦截新窗口请求:NewWindowRequested

默认情况下,WebView2 会尝试在新窗口中打开弹出链接。通过 NewWindowRequested 事件,我们可以拦截弹窗行为并将新内容加载到当前窗口。

示例代码:

private static void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
if (sender is CoreWebView2 webView)
{
e.Handled = true; // 阻止默认弹窗行为
webView.Navigate(e.Uri); // 在当前 WebView2 中加载新页面
}
}

拦截和处理网络响应:WebResourceResponseReceived

通过 WebResourceResponseReceived,我们可以查看并分析所有网络响应。例如,可以记录某些请求的响应时间或检查响应头信息。

示例代码:

private static void CoreWebView2_WebResourceResponseReceived(object sender, CoreWebView2WebResourceResponseReceivedEventArgs e)
{
var uri = e.Request.Uri;
Console.WriteLine($"Response received for: {uri}"); e.Response.Headers.ToList().ForEach(header =>
{
Console.WriteLine($"Header: {header.Key} - {header.Value}");
});
}

添加请求过滤器:AddWebResourceRequestedFilter

为了提高性能并精确控制,WebView2 提供了 AddWebResourceRequestedFilter 方法,用于定义需要监听的请求类型和范围。

使用方法:

webView.CoreWebView2.AddWebResourceRequestedFilter(
"*://www.example.com/*", // 目标 URL 模式
CoreWebView2WebResourceContext.Document // 资源类型:仅文档
);

拦截网络请求:WebResourceRequested

通过 WebResourceRequested 事件,可以拦截网络请求并进行处理,例如修改请求头或阻止特定请求。

示例代码:

private static async void WebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request; // 检查是否有特定 Cookie
if (sender is CoreWebView2 webView)
{
var cookies = (await webView.CookieManager.GetCookiesAsync(request.Uri))
.Where(c => c.Name == "SpecificCookie").ToList(); if (cookies.Any())
{
// 删除特定 Cookie
cookies.ForEach(c => webView.CookieManager.DeleteCookie(c));
}
} Console.WriteLine($"Request intercepted: {request.Uri}");
}

总结

WebView2 是一个强大的控件,为开发者提供了丰富的功能来控制和定制 Web 资源的加载行为。通过本文介绍的事件和方法,你可以:

  • 阻止默认弹窗行为 (NewWindowRequested)
  • 分析网络响应 (WebResourceResponseReceived)
  • 精确过滤需要拦截的请求 (AddWebResourceRequestedFilter)
  • 修改或阻止网络请求 (WebResourceRequested)

借助这些功能,可以更灵活地将 Web 内容集成到桌面应用程序中,满足各种业务需求。

Winform 使用WebView2 开发现代应用的更多相关文章

  1. SNF开发平台WinForm之二-开发-单表表单管理页面-SNF快速开发平台3.3-Spring.Net.Framework

    2.1运行效果: 2.2开发实现: 2.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...

  2. WinForm控件开发总结目录

    WinForm控件开发总结(一)------开篇 WinForm控件开发总结(二)------使用和调试自定义控件 WinForm控件开发总结(三)------认识WinForm控件常用的Attrib ...

  3. winform项目中开发的一套UI控件库

    https://github.com/houyhea/winform-control-lib winform-control-lib 曾经在一个winform项目中开发的一套UI控件库 类图:  效果 ...

  4. 浅谈Winform控件开发(一):使用GDI+美化基础窗口

    写在前面: 本系列随笔将作为我对于winform控件开发的心得总结,方便对一些读者在GDI+.winform等技术方面进行一个入门级的讲解,抛砖引玉. 别问为什么不用WPF,为什么不用QT.问就是懒, ...

  5. ABP VNext框架中Winform终端的开发和客户端授权信息的处理

    在ABP VNext框架中,即使在它提供的所有案例中,都没有涉及到Winform程序的案例介绍,不过微服务解决方案中提供了一个控制台的程序供了解其IDS4的调用和处理,由于我开发过很多Winform项 ...

  6. 基于.net C# Socket WinForm MQTT 客户端开发

    1.什么是MQTT? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的&quo ...

  7. {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件

    在VS2010中使用C#开发基于WinForm的ActiveX控件 常见的一些ActiveX大部分是使用VB.Delphi.C++开发,使用C#开发ActiveX要解决下面三个问题: 使.NET组件可 ...

  8. 告诉你吧,一套皮肤在winform与wpf开发模式下实现的界面效果同样精彩,winform界面和wpf界面。

    一.同一资源: 二.先上软件界面: (1)wpf界面: 在wpf中实现这样类似web风格的软件界面就不用我多说了,在wpf实现这样的风格是很简单的,完全像网页设计一样的. (2)winform界面 在 ...

  9. WinForm资源管理器开发(TreeView&ListView)

    在C# WinForm开发当中,有三大View控件值得深入应用,分别为DataGridView.ListView.TreeView.如果这三大控件能够熟练的应用,其它的控件也就基本没有问题.所以这篇博 ...

  10. WinForm/MIS项目开发之中按钮级权限实践

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

随机推荐

  1. foobar2000 v1.6.11 汉化版(更新于 2022.08.25)

    foobar2000 v1.6.11 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...

  2. UEFI原理与编程(一)

    第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口) 常见缩写及描述: 缩略词 全名 描述 UEFI Unified Extensi ...

  3. 2021年3月国产数据库排行榜:OceanBase勇夺亚军 神舟挺进20强!

    1 新春排行 2021年3月榜单新鲜出炉,同2月相比,本月榜单中十强产品还是原来的面孔,其中3款产品取得了新的名次,榜单座次调整超过半数.前三甲仍然是TiDB.OceanBase.达梦. 冠军:TiD ...

  4. 云原生周刊:Docker 推出 Docker Debug | 2023.10.9

    开源项目推荐 SchemaHero SchemaHero 是一个 Kubernetes Operator,用于各种数据库的声明式架构管理.SchemaHero 有以下目标: 数据库表模式可以表示为可以 ...

  5. 五分钟掌握Python中配置文件解析器configparser的使用

    ---  好的方法很多,我们先掌握一种  --- [背景] 这里描述的配置文件为自动化用例中使用到的信息,非pytest自动化框架中例如pytest.ini, conftest.py等具有特殊意义的配 ...

  6. 一款 C# 编写的神经网络计算图框架

    前言 深度学习技术的不断发展,神经网络在各个领域得到了广泛应用.为了满足 .NET 开发的需求,推荐一款使用 C# 编写的神经网络计算图框架. 框架的使用方法接近 PyTorch,提供了丰富的示例和详 ...

  7. 不容忽视的PCB测试点,关键时刻可以避免批量事故哦!

    ​  PCB测试点是啥子?请看下图: ​ 如果你曾经用过NOKIA手机,每次你打开后盖换电池的时候,每次看到的那两排圆形的点--就是PCB测试点,or you can call it Test Poi ...

  8. NOIP2023模拟9联测30 T4 金牌

    NOIP2023模拟9联测30 T4 金牌 LCA 还能 \(O(1)\)-- 思路 思路非常简单,可考试就是想歪成统计指数了-- 将一条穿过 \((x,y)\) 的路径 \((u,v)\) 分为 \ ...

  9. Redis性能优化的18招

    前言 Redis在我们的日常开发工作中,使用频率非常高,已经变成了必不可少的技术之一. Redis的使用场景也很多. 比如:保存用户登录态,做限流,做分布式锁,做缓存提升数据访问速度等等. 那么问题来 ...

  10. .NET +Vue 开发的高级报表工具

    前言 本文介绍一款基于 .NET 6 开发的高级报表工具.该工具支持多种数据源(如数据库.Excel 文件.API 服务等),并具备强大的数据处理和可视化功能.通过内置的集合函数和类 Excel 界面 ...