前回で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を取り扱っても、これ以上話を面白くすることはできないだろう
と勇気ある撤退を決心しました。(次のネタを思いつくまで、しばしご猶予をお願いします。)
