前回でWebView2のテストプログラムのウィンドウデザインを行いましたので、今回はそのコードビハインドを紹介します。(と、いう程の事は何もしていませんし、それが表題につながるのですが...)

 

【MainWindow.xaml.cs】

using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Security.Policy;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static System.Net.Mime.MediaTypeNames;
//解説:Visual Studioに任せるのは良いのですが、これら↑を皆使うわけですよ。(WebView2の分はありませんが...)

namespace WebView2_1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary> 解説:ここにかけ、とVisual Studioが言っています。

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
/*

解説:最初は初期URL(Google)をxamlのWebView2の所に’Source="https://www.google.com/"’と書いて、このURLをComboboxに設定していましたが、どういうわけか後から読むと空白になっていたこと、またComboBoxでIndexを-1以外に設定すると、立ち上がり時にもSelectionChangedが呼ばれるということを知ったので、コンストラクターで"InitializeComponent();"(コントロールが配置、初期化された後)、GoogleのURLを追加して、Indexをそれに合わせるようにしました。

*/
            //初期URLを設定、表示(OnURLs_SelectionChangedへ飛ぶ)

            URLs.Items.Add("https://www.google.com/");
            URLs.SelectedIndex = 0;

        }

        private void ExitButton_Click(object sender, RoutedEventArgs e)
        {
            Close();    
//解説:xamlファイルを見ていただければわかりますが、ExitボタンのClickメソッドです。
        }

        //ComboBoxに入力があった場合(解説:ComboBoxのTextBox部分にURLを入力してCRを押した時に呼ばれます。)
        private async void URLs_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key != Key.Enter)    
//解説:CR(Enterキー)以外の場合は何もしません。
                return;
            if (String.IsNullOrEmpty(URLs.Text))
   //URLsに入力があるか否かチェック
            {
                MessageBox.Show("Invalid URL, navigating to Google instead.");
                wv2.Source = new System.Uri("https://www.google.com/");    
//解説:何も入力されていない場合はGoogleにしました。
            }
            else                                    
//URLsに入力がある場合
            {
               
// URL の頭に http/https が無ければ付ける(解説:よくある奴ですね。)
                string url = URLs.Text;
                if (!url.StartsWith("http://") && !url.StartsWith("https://"))
                    url = "https://" + url;    
//解説:本当は"http://"(https://は暗号化される)だったら不運と思ってください。
                //解説:以下はWebView2のURL呼び出しの定石コードです。 

                using HttpClient client = new HttpClient();
               
// HEAD リクエストを作成
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, url);
                try    
//解説:URLが存在しない場合等
                {
                    HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
                    if (!response.IsSuccessStatusCode)
                    {
                        MessageBox.Show("ご指定のURLでは、ホームページを開く事ができませんでした。", "URLエラー",
                            MessageBoxButton.OK, MessageBoxImage.Error);
                        return;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + "\nご指定のURLでは、ホームページを開く事ができませんでした。", "URLエラー",
                        MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
               
// OK なら WebView2 に表示
                wv2.Source = new Uri(url);    //解説:これだけで表示されます。
                //URLs(解説:ComboBox名です。)になければ追加する
                if (!URLs.Items.Contains(url))
                    URLs.Items.Add(url);
               
//入力欄をクリア(解説:マニュアル入力の場合はデータを残さないようにしました。)
                URLs.Text = string.Empty;
            }
        }


        //解説:ComboBoxをドロップダウンさせて、その中からURLを選択する場合です。
        private void OnURLs_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string? url = URLs.SelectedItem as string;    
//解説:'?'は「null許容」の意味です。
            //選択されたURLがNullまたはEmptyでないかチェック
            if (String.IsNullOrEmpty(url))
                return;    
//解説:空白やヌル文字は何もしません。(てか、そういうものはリストにない筈ですが為念)
            wv2.Source = new Uri(url);    //解説:URLを表示。
            //Indexを初期化
            URLs.SelectedIndex = -1;    //解説:-1は「無選択」を意味します。
        }

        private void BackButton_Click(object sender, RoutedEventArgs e)
        {

            //戻る
            if (wv2.CanGoBack)
            {
                wv2.GoBack();    
//解説:既にメソッドがあります。
            }
            else
            {
                MessageBox.Show("これ以上戻れません", "エラー", MessageBoxButton.OK, MessageBoxImage.Error);   //エラー表示
                BackButton.IsEnabled = false;
                ForwardButton.IsEnabled = true;

            }
        }


        private void ForwardButton_Click(object sender, RoutedEventArgs e)
        {
           
//進む
            if (wv2.CanGoForward)
            {

//テスト用                MessageBox.Show(wv2.CoreWebView2.Source, wv2.CoreWebView2.DocumentTitle, MessageBoxButton.OK, MessageBoxImage.Information);   //タイトルとURLを表示する
                wv2.GoForward();    //解説:これもメソッドがあります。
            }
            else
            {
                MessageBox.Show("これ以上進めません", "エラー", MessageBoxButton.OK, MessageBoxImage.Error);   //エラー表示
                BackButton.IsEnabled = true;
                ForwardButton.IsEnabled = false;
            }
        }


        private void StopButton_Click(object sender, RoutedEventArgs e)
        {

            //読み込み中止
            wv2.Stop();    //解説:同上。
        }

        private void RetryButton_Click(object sender, RoutedEventArgs e)
        {
           
//再読み込み。
            wv2.Reload();    //解説:同上。
        }

        //解説:以下「拡大」「縮小」ですが、1.25倍と0.8倍にしてあります。
        private void ZoomInButton_Click(object sender, EventArgs e)
        {
            double zoom = wv2.ZoomFactor;
  //Zoomの取得
            MessageBox.Show(zoom.ToString(), "ZoomFactor", MessageBoxButton.OK, MessageBoxImage.Information);
            wv2.ZoomFactor = zoom / 0.8;  
 //Zoomの設定
        }
 

        private void ZoomOutButton_Click(object sender, EventArgs e)
        {
            double zoom = wv2.ZoomFactor;  
//Zoomの取得
            MessageBox.Show(zoom.ToString(), "ZoomFactor", MessageBoxButton.OK, MessageBoxImage.Information);
            wv2.ZoomFactor = zoom * 0.8;    
//Zoomの設定
        }
    }
}

 

以上でWebView2の基本的なURL選択、表示等基本機能(既にWebView2にメソッドがあります)の紹介でした。

 

これを作って思ったのは、(元々ブラウザーというのは基本機能が、また拡張する余地も余りなく)WebView2を張り付けるだけでブラウザーになってしまいますが、多機能なブラウザーは既にEdgeとかChromeとかがありますし、BCCSkeltonでDirectShowのWin32APIをオブジェクトにカプシュール化したり、RichTextコントロールに検索・置換と印刷機能を追加したり、という「ユーザーがやる部分」がほとんどないので、

 

達成感が全くないプログラム

 

となってしまいました。発展の方向性を考えて、不図「右クリックしたらポップアップするコンテキストメニューを、ビデオのコントローラーのようなウィンドウにしたら面白いかも?」と考えましたが、それは「プログラミングの問題ではなく、美術造形デザインの問題」であり、絵心のない私には不向き、という結論です。

 

取り敢えず、私には

 

WebView2を取り扱っても、これ以上話を面白くすることはできないだろう

 

勇気ある撤退を決心しました。(次のネタを思いつくまで、しばしご猶予をお願いします。)