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

pixiv以外のページを表示する事は出来ません。アプリ開発

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

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

関連記事

環境

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;
            }
        }
    }
}
NavigationStarting を実装する

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

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 をページ遷移するようにしました。

こうする事で、新しいウィンドウが出なくなりページ遷移も正しくされるようになっています。

ソースコード

GitHub

タイトルとURLをコピーしました