🦁

.NET + AvaloniaUI 制作日誌⑦(ChatGPT APIクライアントアプリ:最終回)

2023/05/30に公開

AvaloniaUI 制作日誌最終回。

AvaloniaUIで開発していたChatGPT APIのクライアントアプリは、
XAMLの全体的なリファクタリングも済ませまして、まあまあ安定してきた感じなので、これにて一旦開発完了とします。

https://github.com/Jun-Murakami/TmCGPTD-2.0

振りかえり。

AvaloniaUIは、ver.1.0(?)のメジャーリリースを目の前にして開発は加速しており、
破壊的変更がまだちょくちょく起こっている状況です。

しかしそれでも、それなりの規模のアプリを1本開発してみたところ、一部の機能を除いて開発体験はとても良好なものでした。
とにかくXAMLによるGUI記述の取り回しがよく、慣れれば様々なコントロールのカスタマイズを簡単に行えます。

こうしたいな、と思った事は大体APIやサンプルを掘るだけで実現できました。
公開されているライブラリ郡も、.NET MAUIなどよりも充分なものが揃っていると感じます。

ハマりポイント1―IME

弱点は、IMEの日本語対応にまだバグがある事です。

今回はどう回避したかと言うと、最終的に下記の2つのPRを取り入れて、
Windows板のみAvalonia本体のPreview8をフォークしました。

https://github.com/AvaloniaUI/Avalonia/pull/11357
https://github.com/AvaloniaUI/Avalonia/pull/11358

上の、バッファオーバーラン対策のPRに関してはマージされているので、次のバージョンで反映されているはずです。
しかし、肝心の下のIME変換のバグ対策のPRに関しては、他の動作に影響がないことを証明できないとして、作成者の方がPRを取り下げてしまいました。

今回のアプリはテキストエディタがメインの機能ですので、背に腹は代えられず。
このコードを使わせていただきましたが、メジャーリリース前に早急な対応を祈るばかりです。

ちなみにAvalonia本体のビルドはちょっとハマってしまいまして、公式ビルド手順のほか、自分の環境ではWindowsでも下記gitコマンドを実行する必要がありました。

git submodule update --init --recursive

https://github.com/AvaloniaUI/Avalonia/blob/master/Documentation/build.md

また、Windows用のNuGetパッケージを出力する場合は、下記の設定変更を追加する必要がありました。
https://github.com/AvaloniaUI/Avalonia/discussions/6215#discussioncomment-986812

(自分はWindowsのみフォークしたパッケージを使い、IMEバグの無いMacOSでは公式のビルドを使用したので、Macでのビルドは省略した形です)

ハマりポイント2―ブラウザコントロール

もう一つ、今回時間を食ったのは、ブラウザコントロールです。
動的なページを凝ったレイアウトで出力するにはやはりブラウザコントロールに頼らざるを得ないと思うのですが、最近、ChromiumラッパーのCefGlueがAvaloniaV11に対応したので今回はこれを使用しました。
https://github.com/OutSystems/CefGlue

しかしこれが情報がほとんど無くて、とても苦労しました。
WPFやCefSharpなどとは結構勝手が違うらしくて、ネット上の情報が使えないことが多かったです。
コンテキストメニューの設定やJavaScriptEvaluateの戻り値の取得が上手くいかず、結局全ての関数や変数をまとめて一方通行で送り付けてブラウザ側に登録し、無理矢理実装しています。
ページ内検索などもCefGlue/C#側の機能ではなく、ブラウザ内のJavaScriptで独立した関数が動いています。

この辺りは一通りの機能が予め網羅されているMSのWebView2の手軽さに比べるとかなり劣ります。
(一応、WebView2はMac版も今年中に出すような記事をどこかで見た気がしますが、これがリリースされれば大分状況が改善されると思われます。)

まとめ―Avaloniaはいいぞ!

ということで、色々とハマりポイントはあったのですが、特にお気に入りのFluentAvaloniaライブラリのおかげもあり、XAMLでマルチプラットフォームのモダンなアプリが手軽に作れるAvaloniaは、とてもお気に入りのフレームワークとなりました。

今後もちょっとした業務アプリなど作る機会があれば、使っていきたいと思っています。

興味のある方は、まずは下記のいぬいぬさんのまとめを参照しましょう。
(私信ですが、バグ報告の節はありがとうございました。)
https://zenn.dev/inuinu/scraps/7687183f4a4b02

それではごきげんよう。

Discussion