WebView2 を使うと、ページ遷移時のリクエスト情報を見る事が出来ます。
なので、その時に遷移して欲しく無いページだった場合キャンセルをすれば、ページ遷移せずに今のページに踏みとどまる事が出来ます。
関連記事
環境
NavigationStarting を実装する ページ遷移が始まると、一番最初に NavigationStarting イベントが呼ばれます。その時にイベントキャンセルをすればページ遷移を止める事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 using Microsoft.Web.WebView2.Core; using System; using System.Diagnostics; using System.Windows; namespace wpf_webview2 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); InitializeAsync(); } async void InitializeAsync() { await webView.EnsureCoreWebView2Async(null); webView.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested; webView.CoreWebView2.NavigationStarting += CoreWebView2_NavigationStarting; } private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e) { // リンク先を新しいウィンドウで開かなくする。 e.Handled = true; // リンク先をメイン画面のWebView2で開く。 webView.CoreWebView2.Navigate(e.Uri); } private void CoreWebView2_NavigationStarting(object sender, CoreWebView2NavigationStartingEventArgs e) { Debug.WriteLine($"NavigationStarting: {e.Uri}"); var uri = new Uri(e.Uri); // 移動先がpixiv以外の場合は、ページ遷移をキャンセルする。 if (!uri.Host.Contains("pixiv")) { webView.CoreWebView2.ExecuteScriptAsync($"alert('pixiv以外のページを表示する事は出来ません。')"); e.Cancel = true; } } } }
広告等をクリックして pixiv 以外のページを表示しようとすると、ちゃんと動作している事が分かります。
新しいウィンドウを制御する また今回の実装中、新しいウィンドウでページ遷移する事が多々ありました。どのタイミングでそうなるのかは調査してません。
こんな感じで新しいウィンドウが出てしまいます。
NewWindowRequested を実装する それを回避するために NewWindowRequested イベントで制御をするようにしました。
1 2 3 4 5 6 7 8 private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e) { // リンク先を新しいウィンドウで開かなくする。 e.Handled = true; // リンク先をメイン画面のWebView2で開く。 webView.CoreWebView2.Navigate(e.Uri); }
Handled プロパティに true を設定する事によって、新しいウィンドウが表示されなくなります。
しかし、それだけだとページ遷移が無くなってしまうので、メイン画面の Navigate に遷移先のURLを設定して、メインの WebView2 をページ遷移するようにしました。
こうする事で、新しいウィンドウが出なくなりページ遷移も正しくされるようになっています。
ソースコード GitHub