WPF WebView2 特定のサイトのみを表示する

Uncategorized
628 words

WebView2 を使うと、ページ遷移時のリクエスト情報を見る事が出来ます。

なので、その時に遷移して欲しく無いページだった場合キャンセルをすれば、ページ遷移せずに今のページに踏みとどまる事が出来ます。

関連記事

環境

ページ遷移が始まると、一番最初に 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;
}
}
}
}

NavigationStarting を実装する

広告等をクリックして pixiv 以外のページを表示しようとすると、ちゃんと動作している事が分かります。

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