Open19
VSCodeでAvalonia UI ~Epoxyを添えて~
ピン留めされたアイテム
目次
- 基本準備
- UIプレビュー
- 対策
- 知識
XAMLプレビュー方法① AvantGarde
-
AvaloniaUIのプレビューアプリ
- バージョン0.10.18
- Avalonia v11対応版もリリース(AvantGarde v1.4.0)
-
クロスプラットホーム
-
VSCode+Avant GardeでXAMLのプレビューしながら開発できる!
-
ハマりポイント
- csprojの
<TargetFrameworks>
に非対応。<TargetFramework>
にする必要あり。 - アプリ自体のTargetFrameworkとXAMLのTargetFrameworkを合わせないと色々不具合が...
- EpoxyのテンプレだとUIプロジェクトがnetstandard2.0になる
- プレビュー中 にビルドするとファイルがロックされているので失敗する
- close solutionで一旦閉じる
- 大きめの変更したときはdotnet restore & dotnet buildが別途必要
- solution読み直しで動くように
- csprojの
XAMLプレビュー方法② Live.Avalonia
- Avaloniaでhot reloadingを実現するライブラリ
- VSCode + Live.AvaloniaでXAMLのプレビューしながら開発できる!
- 表示だけじゃなくてアプリ自体も普通につかえる
- ハマリポイント
- コードに手を入れる箇所がそこそこ多い
- axamlファイルをdotnet watch対象にcsprojで指定する必要あり
- WindowのXAML設定がスキップされちゃうのでコードで指定する必要あり
-
dotnet run
のときにターゲットフレームワークを指定する必要あり- アプリが複数フレームワーク向けプロジェクトで作られてる時?
- MVUとかで作る時に向いてる
VSCodeでAvalonia UIをやるとき入れたほうがいい拡張・設定
拡張
C#/dotnet基本
- C# for Visual Studio Code (powered by OmniSharp)
- Roslynator https://marketplace.visualstudio.com/items?itemName=josefpihrt-vscode.roslynator
- Auto-Using for C#
- fakesharper https://marketplace.visualstudio.com/items?itemName=fakesharper.fakesharper
- VS Sharper for C# https://marketplace.visualstudio.com/items?itemName=eservice-online.vs-sharper
- MSBuild project tools https://marketplace.visualstudio.com/items?itemName=tintoy.msbuild-project-tools
- Visual NuGet https://marketplace.visualstudio.com/items?itemName=FullStackSpider.visual-nuget
- vscode-solution-explorer https://marketplace.visualstudio.com/items?itemName=fernandoescolar.vscode-solution-explorer
Avalonia
設定
- AXAML(Avalonia UI用XAML)のXSDの設定
- Xml Complete拡張でデフォで設定済
dotnet cli
- avalonia-dotnet-templates
-
Epoxy-avalonia
- Epoxyを使う場合
Avalonia UIのパーツの探し方・調べ方
VSCodeじゃなくても便利。
ギャラリー・サンプルアプリを使う
WASM Playground
- 公式のWASMサンプル
- Windows Storeにあるものよりサンプルが多い
- その場でいじれて便利(VSCode環境だと特にね!)
- wasmなので動かないものもある
FluentAvalonia Samples
-
FluentAvaloniaのギャラリーアプリ
- FluentAvaloniaを使う時用だけど、標準パーツも一部見れる
- 自分でビルドする必要がある(でもかんたん)
- 直接いじれないけど実際に動作する
- 標準パーツ、追加パーツ(WinUIの移植)の両方が見れる
- Fluentな見た目で確認できる
- Show Definitionでプロパティとかの定義も見れる
- たまにサンプルソースがリンク切れ
WinUI3 Gallery
- FluentAvalonia経由でWinUIを使う時用
- FluentAvalonia Samplesより細かく設定変えられたりする
Avalonia 公式 Developer Tools
DebugビルドでF12を押すと、WEBブラウザの開発者向けツールに似た、Developer Toolsが起動する。
起動しない場合は InitializeComponent
内で以下のように呼び出す。
#if DEBUG
this.AttachDevTools();
#endif
Avalonia 日本語対応 状況と対策
v0.10.xの場合
-
TextBox
などで日本語は豆腐になる(仕様) - 日本語のフォントを指定すればOK
- css風に各OSの標準日本語フォントを書けばどのプラットホームでも表示できる
FontFamily="Meiryo UI, Hiragino Sans, Noto Sans CJK JP"
-
メインWindowのxaml中で
TextBox
とかにまとめてスタイルすれば全部指定される-
App
の方がいいかも?Avant Gardeでページ単体を見る時に反映されない
-
-
IMEはインライン入力できない
- Windows10+FluentAvalonia+v0.10.18だと入力できることもある
- 逆に一切入力できなくなることもある…めっちゃ不安定
- コピペはイケル
-
後ろから3文字目?が消えるバグ に遭遇
- 文字列の置き換えやフォント指定で治ったりする
- 再発することもある
v11.xの場合
-
IMEのインライン入力に対応したが、色々と問題がある
- RC1
- Preview8
- ENTERキーを押さずに確定すると文字列が消えるバグ
-
AutoCompleteBox cannot input any by IME while selected an item. · Issue #11426 · AvaloniaUI/Avalonia
- 中国語IMEで発生するので日本語でも発生するかも
-
Pre-edit content doesn't clean up well with Japanese IME · Issue #11309 · AvaloniaUI/Avalonia
- 未確定文字列がDeleteキーで正しく消せない問題
- Preview7
-
Automatic copying of IME text when clicking on another TextBox · Issue #11292 · AvaloniaUI/Avalonia
-
TextBox
に入力した文字列が別のTextBox
クリック時にコピーされちゃうバグ
-
-
Automatic copying of IME text when clicking on another TextBox · Issue #11292 · AvaloniaUI/Avalonia
- Preview6
-
IME preedit doesn't support cursor navigation · Issue #10933 · AvaloniaUI/Avalonia
- 未確定文字列状態でカーソルキーをつかってカーソルを動かせない
-
IME preedit doesn't support cursor navigation · Issue #10933 · AvaloniaUI/Avalonia
- 発生バージョン不明
-
IMEの種類問題
- あたらしいMS-IMEだと問題ないが、古いMS-IMEやGoogle IMEだと問題が発生するバグがある
- 開発者によるとテストされていないとのこと
- 古いMS-IMEはWin11でもビルドインで、新しいMS-IMEで問題が起きるアプリが多いので、特に問題がある
- あたらしいMS-IMEだと問題ないが、古いMS-IMEやGoogle IMEだと問題が発生するバグがある
Avalonia対応ライブラリ・サンプル
- AvaloniaCommunity/awesome-avalonia: A collection of interesting libraries and tools for Avalonia project.
- 基本的なものは↑ここに
- 以下awesome-avaloniaにないもの
- ✔は動作確認済、なしは未確認
- ➕はawesome-avaloniaに追加済
Control
- ➕Avalonia Labs
- 公式の実験的UI
- AsyncImage、TabControl、FlipView、NavigationControl
-
MediaPlayerUI.NET
- Avalonia/WPFに対応したメディアプレイヤーUI
- ただし、Avalonia版は非商用利用限定のBASSを利用するので制限あり
- Laminar.Avalonia.SelectAndMove
- ➕wieslawsoltes/ColorPicker: Avalonia ColorPicker control
- wieslawsoltesさんによるカラーピッカー
- ➕wieslawsoltes/NodeEditor: A node editor control for Avalonia.
- ノードグラフエディタコントロール
- ➕wieslawsoltes/Dock: A docking layout system.
- UniDockとは別のドックレイアウトコントロール
-
Avalonia.Controls.ProgressRing
- Avalonia Progress Ring とは別のプログレスリング
- AvaloniaQrCodeControl
-
Manufaktura.Controls.Avalonia
- 楽譜表示
-
GridExtra.Avalonia
- 便利なGrid拡張
- 元はFluentWPFの開発者のWPF/UWP向けライブラリ。移植
- Avalonia版は一部Avalonia公式プロパティをそのまま使うため注意
-
LoadingIndicators.Avalonia
- 9種類のローディングインジケータ
-
Zafiro.Avalonia
- This library offers common (and useful) features to AvaloniaUI based applications.
-
Baksteen.Avalonia.Tools.GridIndexer
- Gridのインデックス指定を
+1
とかできるライブラリ
- Gridのインデックス指定を
Theme & Control
-
AntDesign.Avalonia
- AntDesignのテーマ
- Romzetron.Avalonia
-
Ursa.Avalonia
- Semi.Avaloniaの開発者が作成しているUI Controls
- Navigation, TagInput, Button group, Timeline, Pagenation, IPv4Box
-
Macabresoft.AvaloniaEx
- Macabre2Dというゲームエンジンエディタで使われているコントロール&テーマ
- PleasantUI
MVVM
- ✔Epoxy
-
Mvvm.Navigation
- NavigationのコードをSource Generatorで自動生成するライブラリ
-
Stylet.Avalonia
- WPF/UWPのCaliburn.MicroにインスパイアされたMVVMライブラリ
MVU
Rx
SourceGenerator
-
AvaSourceGenerators
-
StyledProperty
やDirectProperties
を自動生成してくれるSG
-
l8n/i18n
-
CodingSeb.Localization
- Avalonia/WPFに対応したローカライズ用ライブラリ
-
resx
じゃなくてjson
やyaml
でテキスト指定できる - resx用意しなくていいのでVSCodeで作るときに楽
- WPF版は動作確認済
- Ao.Lang.AvaloniaUI
Other
-
NetSparkle
- 有名なアプリの更新ライブラリ(updater)
-
Baksteen.Avalonia.Blazor
- BlazorとAvaloniaのハイブリッドアプリのライブラリとデモ
- ✔Avalonia.Preferences
- クロスプラットフォーム対応のpreference(設定)ライブラリ
-
Clowd.Clipboard
- クリップボード管理ライブラリ
- ➕PupNet Deploy - Publish & Package for .NET
- クロスプラットホームパブリッシュツール
- AvanGardeの作者によるツールでzip/AppImage/InnoSetupなどにコンパイル&パブリッシュできるらしい
-
FontPicker
- フォント選択
Avalonia XPFとは
- Avalonia社が提供する 企業向け商用サービス
- 既存のWPFアプリをクロスプラットフォーム移植してくれるというもの
- 技術的にはモバイルやWASM対応もできるけど、まずはDesktopむけ
- すでにアプリがある会社が利用するもので個人開発者は基本的に関係ない
- 内部的にAvaloinia UIの仕組みが使われているらしい
Avalonia UI | Avalonia XPF | |
---|---|---|
これはなに | UIフレームワーク | サービス |
価格 | 無料 | 有料 |
誰向け | 誰でも | 企業のみ |
日本語がわかる人がつくってるっぽいAvalonia関係
日本語情報がほとんどないAvaloniaだけど、この辺の作者さんに聞けば色々わかることがあるかも?
アプリ
ライブラリ
Avalonia v11情報
v11.1 beta
-
HyperLinkButton
control が追加 - XAML中でWPFにもある
UpdateSourceTrigger
が使えるように - tvOS/AndroidTV/TizenTVのサポート。リモコン操作できるように
v11.0 Released!
- 2023-07-05リリース
Avalonia for Visual Studio Code (Early Access)
- ついに公式のVSCode向け拡張が発表
- XAML補完
- プレビューワ
- 支援者むけに先行公開中
- 普通につかえるようになった
- https://github.com/AvaloniaUI/AvaloniaVSCode
- ただし、v11.0.2以前じゃないとうまく動かないらしい
- 他にも初回の反映に時間がかかるなど色々と細かい使い勝手が良くない問題あり
対応ライブラリ
-
Epoxy
-
Epoxy.Avalonia11
というのがリリースされた(v0.10系以前とは別に分かれた)
-
-
FluentAvalonia
- v2.0.0がリリース
- 以前なかった新しいControlも追加されている模様
-
NP.Ava.UniDock
- NP.Avalonia.UniDockのv11対応版
- 2023年末にやっと出た
migration to v11 memo
Porting guide
porting guideに無い箇所
- file選択/saveダイアログ系は新apiに変更されている
- 結構別物
StorageProvider
に変わっているので注意 - https://docs.avaloniaui.net/docs/next/concepts/services/storage-provider
- 結構別物
-
With(new Win32PlatformOptions…
は不要の様子 - drag and drop処理は以前のままだと
System.ObjectDisposedException
出ることがある-
Dispatcher.UIThread.InvokeAsync
経由でVMの処理を呼んでいた箇所 - そのままVMのメソッドを呼べば動くように
-
await vm.DropFileEventAsync(e)
.ConfigureAwait(false);
- Bindingのランタイムエラーがよく出るように
- どうもこういうものらしい(仕組み上しかたないとのこと)
ライブラリ
- Epoxy
-
CommandFactory
->Command.Factory
-
- FluentAvalonia
-
SymbolIcon
のsymbol指定文字列が一部無くなっている(*Fill
系)- symbol指定文字列はv2.0.0のサンプルアプリで検索できる
-
ui:SplitButton
に対するスタイル指定がエラーに- そもそも使っていなかったので消したらエラー無くなった
-
XAMLプレビュー方法③:Avalonia for Visual Studio Code
公式のVSCode拡張。
-
プレビュー可能な公式VSCode拡張
- XAML補完とかもある
-
現時点の問題点
- v11.0.2以下でないとプレビューがうまくいかない
- 初回表示までにとても時間がかかる
-
クリック操作などは機能しない(一部直ってた)
プレビュー機能だけで言うと①や②の方が現時点では実用的。
XAMLプレビュー方法④ HotAvalonia
HotReloadを実現するライブラリ。
ドキュメントを読む限り、Live.Avaloniaより使いやすそう。
- dotnet watch 不要 (普通にビルドしても有効になる)
- ただし.NET 7以降はデバッガー接続起動かwatch推奨らしい
- 手を入れる行数少ない
Dock.Avalonia 関連
不穏な雰囲気
- 一瞬ライセンスがAGPLに変わってすぐにMITに戻った
- OSSでつかってほしいのかな?
- github issuesが消えた
- サポートしない方針?
描画系
- プレビュー系と相性が悪い
- HotAvalonia, AvantGardeともに更新がエラーになる
- 生産性は良くない
- 公式DevToolでツリーが追えない
- Dockの中に隠されてしまう
FluentAvalonia + Dock.Avalonia
- そのままだと見えなくなる
- RGBのColorを指定すればとりあえず見えるようにはなる
- RGBAのBrushを指定できない
- なのでテーマ(Dark/Light)の切替は手動
- Converterで持ってきたい所…
- なのでテーマ(Dark/Light)の切替は手動
App.axaml
<Application.Resources>
<idcr:ControlRecycling x:Key="ControlRecyclingKey" TryToUseIdAsKey="True" />
<Color x:Key="RegionColor">Transparent</Color>
<SolidColorBrush x:Key="DockApplicationAccentBrushLow">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="DockApplicationAccentBrushMed">#1C97EA</SolidColorBrush>
<SolidColorBrush x:Key="DockApplicationAccentBrushHigh">#52B0EF</SolidColorBrush>
<SolidColorBrush x:Key="DockApplicationAccentForegroundBrush">#F0F0F0</SolidColorBrush>
<SolidColorBrush x:Key="DockApplicationAccentBrushIndicator">#007ACC</SolidColorBrush>
<SolidColorBrush x:Key="DockThemeBorderLowBrush" Color="#808080" />
<SolidColorBrush x:Key="DockThemeBackgroundBrush" Color="#F0F0F0" />
<SolidColorBrush x:Key="DockThemeAccentBrush" Color="#FF8888" />
<SolidColorBrush x:Key="DockThemeForegroundBrush" Color="#FEFEFE" />
<SolidColorBrush x:Key="DockThemeControlBackgroundBrush" Color="#0000F0" />
</Application.Resources>
UniDock関連
-
NP.Ava.UniDock の方でv11対応版出た
- NP.Avalonia.UniDockはv0.10以前
サンプルコード
- なぜかgit submoduleで必要ライブラリが全部落としてこれない…
- Releaseビルドだと動いた
- Debugビルドでもnugetに上がってるライブラリだけで動くようにcsproj書き換えちゃってもいいかも
Avalonia XAML Tips
$parent
Bindingで親要素は- さらにその親は
$parent[n]
でどんどん階層を上がって行ける-
$parent
=$parent[0]
; 一つ目の親が0
-
- 詳細:Binding to an Ancestor
- 親要素のWindow:
$parent[Window]
$parent[ControlName]
Bindingで祖先のcontrolは -
$parent[Window]
でウィンドウ参照できる - もっと上は
$parent[ControlName; n]
でどんどん階層を上がって行ける
Bindingで別のコントロールのViewModelを参照するにはキャスト&再ビルド
-
((vm:MyUserControlViewModel)DataContext)
とする - ホットリロードだとエラーになる。要再ビルド
<Button Command="{Binding $parent[ItemsRepeater].((vm:MyUserControlViewModel)DataContext).DoItCommand}"
CommandParameter="{Binding ItemId}"/>
!
Bindingで否定は-
IsEnabled = "{Binding !#someElem.IsEnabled}"
みたいな反転ができる
<Element IsEnabled = "{Binding !#someElem.IsEnabled}" />
Task<T>
にbind)
非同期Bind(-
Task<T>
を返す非同期処理にBindできる- 返ってくるまでの内容を
FallbackValue
で指定できる - How to Bind to a Task Result
- 返ってくるまでの内容を
<TextBlock Text="{Binding MyAsyncText^, FallbackValue='Wait a second'}" />
"{Binding $parent.Bounds.Width}"
親要素と同じ幅を指定するのは -
$parent.Width
だとダメ。Bounds経由で。
Epoxy + Avalonia でCommandのバインドがうまくいかない時
- EpoxyにはEventBinderというCommandがバインドできなくてもバインドできる便利機能がある
axaml
<NoCommandControl>
<epoxy:EventBinder.Events>
<epoxy:Event EventName="TargetEvent" Command="{Binding MyCommand}" />
</epoxy:EventBinder.Events>
</NoCommandControl>
- でもAvaloniaだとEventBinderが使えないことがちょくちょくある
- SliderとかのPointWheelEvent
- DragDrop.DropEvent
- ランタイムエラー:
'Epoxy.Event'.'Command': 'Null value in expression '{empty}' at ''.'(Event #nnnnnnnn)
- なんもわからん
- WPF版Epoxyだともう少し色々できたような…
Ancher/Pileを使う
解決策1:- VMでWindow.LoadedにバインドしたReadyコマンドの中とかで、
piledControl.SomeEventChanged += MyCommand()
する - HotAvaloniaのhotreloadと相性悪い場合にも使える
解決策2: あきらめてコードビハインド
- DragDrop.DropEventはPile/Anchor使っても上手くいかなかった
- 正直よく使うから何とかしたい…
- HotAvaloniaのhotreloadと相性悪い?
CodingSeb.Localization for Avalonia v11
- nuget v1.3.0 MethodMissingのランタイムエラー
- AvaloniaSample
- v11.0.*ではビルドが通らない
- Fork
-
CodingSeb.Localization.Loc
が見つからないビルドエラー- nugetの
CodingSeb.Localization
ではなく、git submoduleなどでCodingSeb.Localization
に参照するとうまくゆく
- nugetの
- readme.md の xmlns が正しくない(WPFでも問題あり)
readme.md
xmlns:loc="clr-namespace:Localization;assembly=Localization"
rewrite
xmlns:loc="clr-namespace:CodingSeb.Localization;assembly=CodingSeb.Localization"