WebViewのカスタムコントロールを作る
Xamarinで開発したときはiOSのWkWebViewと使うためにRendererを使って実装していましたが、MAUIに移行したらJavaScriptが実行されなかったり問題が色々でました。
ハンドラーを使った実装を調べました。
https://stackoverflow.com/questions/73217992/js-net-interact-on-maui-webview
こちらの書き込みに色々試した形跡があり、サンプルコードもありました。
https://github.com/nmoschkin/MAUIWebViewExample
これらを参考にして、Sourceプロパティを扱えるようにし、C#からJavaScript実行できるようにしてみました。
※ひとまず動作してはいますが、あまり詳しくないので変なコードになっていてもご容赦ください。
MainPage.xaml
・C#からJavaScriptを実行するためのボタンを追加
MainPage.xaml.cs
・ViewModelのSourceプロパティへの設定を、MyWebViewのSourceプロパティの設定へ変更
・追加したボタンのクリックイベントを作成し、MyWebView.EvaluateJavaScriptAsyncでJavaScriptを実行する処理を追加
HyblidWebView.cs
・IHybridWebViewの継承元をIView→IWebView
・HybridWebViewの継承元をView→WebView
・Sourceプロパティ関係の記述を削除
HybridWebViewHandler.cs ※iOS
・Sourceプロパティ関係の記述を削除
・HybridWebViewHandlerクラスの継承元をViewHandler→WebViewHandlerに変更
・PropertyMapperを定義し、Sourceプロパティををマッピング
・コンストラクタにMapperとCommandMapperを渡す
・JSBridgeクラスでhybridRenderer.VirtualViewにアクセスするときにHybridWebViewにキャストする。
WebViewHandlerに定義がないプロパティ(今回の場合はSource)を使いたい場合は、PropertyMapperでマッピングを追加しないといけません。
EvaluateJavaScriptAsyncはWebViewHandlerに定義があるので、マッピングしなくても使えます。