WebView2 を使うと、ページ遷移時のリクエスト情報を見る事が出来ます。
なので、その時に遷移して欲しく無いページだった場合キャンセルをすれば、ページ遷移せずに今のページに踏みとどまる事が出来ます。
関連記事
環境
- Windows 10 Home 20H2
- Visual Studio Community 2019
- .NET Core 3.1
- WebView2 1.0.721-prerelease
NavigationStarting を実装する
ページ遷移が始まると、一番最初に NavigationStarting イベントが呼ばれます。その時にイベントキャンセルをすればページ遷移を止める事が出来ます。
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 イベントで制御をするようにしました。
private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
// リンク先を新しいウィンドウで開かなくする。
e.Handled = true;
// リンク先をメイン画面のWebView2で開く。
webView.CoreWebView2.Navigate(e.Uri);
}
Handled プロパティに true を設定する事によって、新しいウィンドウが表示されなくなります。
しかし、それだけだとページ遷移が無くなってしまうので、メイン画面の Navigate に遷移先のURLを設定して、メインの WebView2 をページ遷移するようにしました。
こうする事で、新しいウィンドウが出なくなりページ遷移も正しくされるようになっています。