WebView2 是 Microsoft 提供的一種嵌入式瀏覽器控件,基于 Edge (Chromium) 引擎。
它允許開發(fā)者將現(xiàn)代 Web 技術(shù)(如 HTML、CSS 和 JavaScript)與桌面應(yīng)用相結(jié)合,從而構(gòu)建強(qiáng)大、靈活的用戶界面。
本文將介紹 WebView2 的基本使用,并重點(diǎn)講解以下幾個(gè)重要功能:
NewWindowRequested
WebResourceResponseReceived
AddWebResourceRequestedFilter
WebResourceRequested
環(huán)境準(zhǔn)備
安裝 WebView2 Runtime: WebView2 需要運(yùn)行時(shí)支持,用戶設(shè)備必須安裝 WebView2 Runtime。如果未安裝,可以通過以下鏈接下載:https://go.microsoft.com/fwlink/p/?LinkId=2124703。
引入必要的 NuGet 包: 在 Visual Studio 中,添加 Microsoft.Web.WebView2
NuGet 包。
初始化 WebView2: 創(chuàng)建 WebView2 控件并確保其已正確初始化。以下代碼檢查并安裝 WebView2 Runtime:
private static async Task<bool> InitializeWebView2()
{
try
{
string version = CoreWebView2Environment.GetAvailableBrowserVersionString();
return !string.IsNullOrEmpty(version);
}
catch
{
MessageBox.Show("WebView2 Runtime 未安裝。請(qǐng)安裝后重試。", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
創(chuàng)建 WebView2 控件
以下代碼展示了如何創(chuàng)建 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;
// 添加請(qǐng)求過濾器
webView2.CoreWebView2.AddWebResourceRequestedFilter("*://www.example.com/*", CoreWebView2WebResourceContext.Document);
webView2.CoreWebView2.WebResourceRequested += WebView2_WebResourceRequested;
return webView2;
}
攔截新窗口請(qǐng)求:NewWindowRequested
默認(rèn)情況下,WebView2 會(huì)嘗試在新窗口中打開彈出鏈接。通過 NewWindowRequested
事件,我們可以攔截彈窗行為并將新內(nèi)容加載到當(dāng)前窗口。
示例代碼:
private static void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
if (sender is CoreWebView2 webView)
{
e.Handled = true;
webView.Navigate(e.Uri); // 在當(dāng)前 WebView2 中加載新頁面
}
}
攔截和處理網(wǎng)絡(luò)響應(yīng):WebResourceResponseReceived
通過 WebResourceResponseReceived
,我們可以查看并分析所有網(wǎng)絡(luò)響應(yīng)。例如,可以記錄某些請(qǐng)求的響應(yīng)時(shí)間或檢查響應(yīng)頭信息。
示例代碼:
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}");
});
}
添加請(qǐng)求過濾器:AddWebResourceRequestedFilter
為了提高性能并精確控制,WebView2 提供了 AddWebResourceRequestedFilter
方法,用于定義需要監(jiān)聽的請(qǐng)求類型和范圍。
使用方法:
webView.CoreWebView2.AddWebResourceRequestedFilter(
"*://www.example.com/*",
CoreWebView2WebResourceContext.Document // 資源類型:僅文檔
);
攔截網(wǎng)絡(luò)請(qǐng)求:WebResourceRequested
通過 WebResourceRequested
事件,可以攔截網(wǎng)絡(luò)請(qǐng)求并進(jìn)行處理,例如修改請(qǐng)求頭或阻止特定請(qǐng)求。
示例代碼:
private static async void WebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
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}");
}
總結(jié)
WebView2 是一個(gè)強(qiáng)大的控件,為開發(fā)者提供了豐富的功能來控制和定制 Web 資源的加載行為。通過本文介紹的事件和方法,你可以:
- 阻止默認(rèn)彈窗行為 (
NewWindowRequested
) - 分析網(wǎng)絡(luò)響應(yīng) (
WebResourceResponseReceived
) - 精確過濾需要攔截的請(qǐng)求 (
AddWebResourceRequestedFilter
) - 修改或阻止網(wǎng)絡(luò)請(qǐng)求 (
WebResourceRequested
)
借助這些功能,可以更靈活地將 Web 內(nèi)容集成到桌面應(yīng)用程序中,滿足各種業(yè)務(wù)需求。
閱讀原文:原文鏈接
該文章在 2025/1/18 18:17:44 編輯過