[C#] 在 WinForms 中使用 Edge WebView2 處理新視窗點擊事件

2024-06-07

這幾天分享一了關於 Edge WebView2 的應用,這時候有同事問我如何處理開新視窗之後的處理

他必須要模擬點擊,但是該連結為 _blank ,他必須要處理點擊後的視窗,在預設中的確會開啟一個新的視窗長這樣..

今天目標就是我們在設計一個新的 Form  (NewlinkForm) 裡面一樣放一個 Edge WebView2 然後讓視窗點超連結後,都是繼續給 NewlinkForm 來處理

1. 參考這篇文章將 Edge WebView2 設定好

2.開一個新得 Form 這邊取名為 NewlinkForm 下面是原始碼基本上就是,透過 Ctor 串入一個網址,並且在 Edge  WebView 2Init 好之後載入網址

using Microsoft.Web.WebView2.Core; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TestWebView2 { public partial class NewlinkForm : Form { public string Url { get; set; } public NewlinkForm(string url) { InitializeComponent(); Url = url; webView21.EnsureCoreWebView2Async(); webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted; } private void CoreWebView2_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) { //自動開啟 DevTools webView21.CoreWebView2.OpenDevToolsWindow(); } private void WebView21_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e) { webView21.CoreWebView2.Navigate(Url); //在 Init 後加入,不然容易出錯 webView21.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted; } private void NewlinkForm_Load(object sender, EventArgs e) { } } }


這裡面,我還加上了入如果網頁載入完成我會自動打開 DevTools


3. 回到第一個視窗,我們在處理點擊 Link 後的事件 主要是在 CoreWebView2InitializationCompleted 後加入 NewWindowRequested 的事件

如果不是在 CoreWebView2InitializationCompleted 後加入事件有可能會出錯 ,我在 StackOverflow  上面看到蠻多的

public Form1() { InitializeComponent(); webView21.EnsureCoreWebView2Async(); webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted; webView21.NavigationCompleted += WebView21_NavigationCompleted; } private async void WebView21_NavigationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e) { } private void WebView21_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e) { MessageBox.Show("Init Already"); webView21.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested1; } private void CoreWebView2_NewWindowRequested1(object sender, CoreWebView2NewWindowRequestedEventArgs e) { //default:false //改成 true 原本的webview2 就不會有反應,而是交給下面的程式碼來處理 e.Handled = true; //自己做的新視窗,以方便掌控之後的新點開的網站處理 var newSelBrowser = new NewlinkForm(e.Uri.ToString()); newSelBrowser.Show(); }


結果:


今天筆記到這邊,希望有幫助到需要的人。


reference:

https://learn.microsoft.com/zh-tw/uwp/api/windows.ui.xaml.controls.webview.newwindowrequested?view=winrt-22621



當麻許的碎念筆記 2014 | Donma Hsu Design.