WebView2コントロールの使い方、最初の一歩
WebView2コントロールに使ってみたので、その時の覚書です。
よく見るサンプルコード
WebView2コントロールを使う場合、MS含め良く見るのは以下のようなサンプル。
WebView2コントロールは初期化に時間がかかるので、以下のように非同期処理で初期化が完了するまで待つ必要があるそうです。
private void Form_Load(object sender, EventArgs e)
{
InitializeAsync();
}
private async void InitializeAsync()
{
await WebView2.EnsureCoreWebView2Async(Nothing);
}
このサンプル通りならまだ普通に動いちゃうところが落とし穴・・・
今回はLoadイベントで初期ページを開きたいので、以下のように書くんだけど、WebView2.CoreWebView2.Navigateの呼び出しでNullReferenceExceptionが発生して全く動かない・・・
private void Form_Load(object sender, EventArgs e)
{
InitializeAsync();
///中略
WebView2.CoreWebView2.Navigate(uri);
}
private async void InitializeAsync()
{
await WebView2.EnsureCoreWebView2Async(Nothing);
}
ちゃんと動くコード
↑のよく見るサンプルだと、ちゃんと非同期処理されないのでWebView2コントロールの初期化が完了するまで待ちません・・・
初期化の完了を待つ前提でWebView2.CoreWebView2.Navigateを呼び出していたので、そこでNullReferenceExceptionが発生しちゃってました。
正解は以下のように書くこと。
こうすることで、ちゃんと非同期処理でWebView2の初期化の完了を待つようになります。
private async void Form_Load(object sender, EventArgs e)
{
await InitializeAsync();
///中略
WebView2.CoreWebView2.Navigate(uri);
}
private async Task InitializeAsync()
{
await WebView2.EnsureCoreWebView2Async();
}
まあなんだ非同期処理をちゃんと理解してればハマらないんだろうけど、めったやたらと使わないから忘れちゃうよね・・・