C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: WEBVIEW2でブラウザを作りたい winform


(過去ログ 173 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■99793 / inTopicNo.1)  WEBVIEW2でブラウザを作りたい winform
  
□投稿者/ 独学者 (1回)-(2022/06/03(Fri) 22:31:27)

分類:[.NET 全般] 

お世話になります

webview2 なるものがあることを知り、超カンタンにブラウザを作れると知りました
そこでネットで調べると下記のコードがヒットしましたので調べたところ次の疑問ができました
ご教授お願いたします

●疑問1●
WEBを表示方法は下記の2種類、@Aに使い分けはあるのか

@ WebView2.CoreWebView2.Navigate("https://web.biz-prog.net/")

A Dim weburl As New System.Uri("https://web.biz-prog.net/")
  Me.WebView21.Source = New System.Uri(web_url)

●疑問2●
待機の件
.Navigate では ページの読み込み・表示が終わるまでの待機する処理が必要です。
とのことですが
下記のサンプルでは
If condition.Wait(5000) Then
result = "ok"
Else
result = "timeout"
End If

ではただただ5秒待ってるだけで「表示が終わることを待ってる」ようには見えないですが
そういうものなのか?






Imports Microsoft.Web.WebView2.Core

Public Class Form1

Private ReadOnly condition As New System.Threading.CountdownEvent(1)

Private Sub FormWebView2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
InitializeAsync()
End Sub

Async Sub InitializeAsync()
Await WebView2.EnsureCoreWebView2Async(Nothing)
End Sub

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim result As String = ""
'サイトの表示を開始
WebView2.CoreWebView2.Navigate("https://web.biz-prog.net/")

'非同期実行
Await Task.Run(
Sub()
'読み込み完了まで待機
If condition.Wait(5000) Then
result = "ok"
Else
result = "timeout"
End If
End Sub
)

MsgBox(result)

End Sub

Private Sub WebView2_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView2.NavigationCompleted

'読み込み結果を判定
If e.IsSuccess Then
Console.WriteLine("complete")
Else
Console.WriteLine(e.WebErrorStatus)
End If

'シグナル初期化
condition.Signal()
System.Threading.Thread.Sleep(1)
condition.Reset()

End Sub

End Class
引用返信 編集キー/
■99794 / inTopicNo.2)  Re[1]: WEBVIEW2でブラウザを作りたい winform
□投稿者/ 伝説のカレー (13回)-(2022/06/03(Fri) 23:10:05)
No99793 (独学者 さん) に返信
> ではただただ5秒待ってるだけで「表示が終わることを待ってる」ようには見えないですが
> そういうものなのか?

> condition.Wait(5000)

これは何を待ってるかというと、カウントが0になるのを待ってます
最大で5秒間待ちますよということです

> Private ReadOnly condition As New System.Threading.CountdownEvent(1)

カウントはここで1がセットされます

> Private Sub WebView2_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView2.NavigationCompleted
>   condition.Signal()

カウントはここでデクリメントされて0になります

WebView2.NavigationCompletedはページの読み込みが完了したときに発火されるイベントです
「表示が終わることを待ってる」ということです

引用返信 編集キー/
■99795 / inTopicNo.3)  Re[2]: WEBVIEW2でブラウザを作りたい winform
□投稿者/ くま (195回)-(2022/06/04(Sat) 02:11:18)
> 超カンタンにブラウザを作れると知りました
超カンタンではないですよ。

WebView2とwinowsフォーム側が非同期で動くので同期化する必要があったり
初期設定の仕方やイベントなどいろいろ複雑に絡み合います。
その辺りは試行錯誤が必要となるのでお気をつけください。

またWebView2は毎月のようにバージョンが上がってセキュリティや機能が追加になります。
最新情報を確認する事もお忘れなく。
引用返信 編集キー/
■99796 / inTopicNo.4)  Re[3]: WEBVIEW2でブラウザを作りたい winform
□投稿者/ kuma (1回)-(2022/06/04(Sat) 02:23:31)
2022/06/04(Sat) 02:24:07 編集(投稿者)

訂正
引用返信 編集キー/
■99797 / inTopicNo.5)  Re[4]: WEBVIEW2でブラウザを作りたい winform
□投稿者/ くま (196回)-(2022/06/04(Sat) 02:24:25)
参考URL
https://docs.microsoft.com/ja-jp/microsoft-edge/webview2/get-started/winforms
https://docs.microsoft.com/ja-jp/microsoft-edge/webview2/get-started/get-started
https://github.com/MicrosoftEdge/WebView2Samples
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.web.webview2.winforms.webview2?view=webview2-dotnet-1.0.1210.39

疑問1
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.web.webview2.winforms.webview2.source?view=webview2-dotnet-1.0.1210.39#microsoft-web-webview2-winforms-webview2-source
一緒です

疑問2
すでに答えが書かれていますが
Button1_Clickでページ移動後、
condition変数のカウントが0になるまで待機していて

WebView2_NavigationCompletedでページ移動が何かしらの形で完了した際
condition変数のカウントを0に設定すると
Button1_Clickで止まっていた処理が再開する仕組みです。
引用返信 編集キー/
■99798 / inTopicNo.6)  Re[5]: WEBVIEW2でブラウザを作りたい winform
□投稿者/ 独学者 (2回)-(2022/06/04(Sat) 09:10:53)
伝説のカレーさま
くまさま

とてもわかりやすく教えていただき、ありがとうございました


●疑問1●
@ .Navigate
A .Source

が同じということなのですが
@では準備未完了の場合にエラーになるのがデメリットになると思います
Aにデメリットのようなものがないのか疑問に思いました

もし何か既知の事柄があれば、教えていただきたいです




引用返信 編集キー/
■99799 / inTopicNo.7)  Re[6]: WEBVIEW2でブラウザを作りたい winform
□投稿者/ くま (197回)-(2022/06/04(Sat) 09:24:49)
2022/06/04(Sat) 09:25:10 編集(投稿者)
> @では準備未完了の場合にエラーになるのがデメリットになると思います
> Aにデメリットのようなものがないのか疑問に思いました
> 
> もし何か既知の事柄があれば、教えていただきたいです

ん?どっちも準備未完了ならエラーになるよ。
>Async Sub InitializeAsync()
>  Await WebView2.EnsureCoreWebView2Async(Nothing)
>End Sub

これじゃ足りなくて

        Try
            Dim cacheFolderPath As String = ""
            Dim webView2Environment As Microsoft.Web.WebView2.Core.CoreWebView2Environment

            '----- WebView2のキャッシュフォルダ指定(書き込み可能パス)
            cacheFolderPath = "WebView2のキャッシュフォルダのパス"
            Try
                webView2Environment = Await Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(Nothing, cacheFolderPath)
            Catch ex As Exception
                Startup.ExceptionHandling(ex, "キャッシュフォルダ[" & cacheFolderPath & "]にアクセスできませんでした。")
                Return True
            End Try

            Try
                '----- WebView2の初期化の完了を待つ(エラー回避)
                Await Me.WebView2.EnsureCoreWebView2Async(webView2Environment)

                '----- シグナル設定(別処理で初期化の完了を判定する為の処理)
                IsInitializationCompleted = True
                If condition.CurrentCount > 0 Then
                    condition.Signal()
                End If

            Catch ex As Exception
                '----- 処理実行前にフォームが閉じられるとエラーとなる。
                Return True
            End Try

            Return False
        Catch ex As Exception
            Return True
        End Try

これぐらい必要でさらに
CoreWebView2_InitializationCompleted
でイベントの追加とかしないといけないから。
さすがに全部は書けないのであとは調べてね

引用返信 編集キー/
■99804 / inTopicNo.8)  Re[6]: WEBVIEW2でブラウザを作りたい winform
□投稿者/ 大谷刑部 (191回)-(2022/06/06(Mon) 15:08:39)
No99798 (独学者 さん) に返信
> 伝説のカレーさま
> くまさま
>
> とてもわかりやすく教えていただき、ありがとうございました
>
>
> ●疑問1●
> @ .Navigate
> A .Source
>
> が同じということなのですが
> @では準備未完了の場合にエラーになるのがデメリットになると思います
> Aにデメリットのようなものがないのか疑問に思いました

正直どっちでも大差ないと思います。
@は指定したURLにナビゲートするという意味で、Aは遷移するURLを設定するという違いでしかないので。

それよりも、
NavigationCompletedは他の方も指摘してるようにあくまでナビゲートが完了した、つまり、ページにたどり着いて初めて発生するので、
その前段階のコントロール自体の起動に時間がかかっているとかエラーが発生している場合にはイベント発生すらしません。

CoreWebView2InitializationCompletedイベント(コントロールの初期化が完了した時)を活用するとかは環境によっては考えた方がいいですし、
待機処理を_Loadにするか、_Shownにするかは考えた方が方がいいでしょうね。
Webview2コントロールの起動自体に時間がかかるような環境だと、ほぼ間違いなく画面の起動の方が先に終わるので、
Loadイベントで待機すると、見た目上、画面の起動自体に時間がかかっているような誤解を与えやすいです。








引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -