.NETクロスプラットフォームクライアントフレームワーク - Avalonia UI

.NETクロスプラットフォームクライアントフレームワーク - Avalonia UI

これはWPF XAMLベースのクロスプラットフォームUIフレームワークであり、複数のオペレーティングシステム(Windows(.NET Core)、Linux(GTK)、MacOS、Android、iOS)、Web(WebAssembly)をサポートしています。

最終更新 2024/10/24 10:32
沙漠尽头的狼
読了目安 6 分
カテゴリ
Avalonia UI
タグ
.NET C# WPF Avalonia UI クロスプラットフォーム

本記事の目次

1. Avalonia UI の概要

Avalonia UI ドキュメントチュートリアル: https://docs.avaloniaui.net/docs/getting-started

クロスプラットフォームがますます普及し、.NET がクロスプラットフォームをサポートしてから十数年が経ちます(Mono の登場以来)。

しかし、現在の .NET ベースのクロスプラットフォームは、依然として B/S アーキテクチャのクロスプラットフォーム が主流です。C/S アーキテクチャに関しては、多くの人が Qt を使用するか、以前は Mono を使用して .NET 開発者がクロスプラットフォームアプリを開発できました。Microsoft が Xamarin を買収した後、今年(2022年)になって MAUI クロスプラットフォームフレームワークが正式にリリースされ、さらにサードパーティのクロスプラットフォームフレームワーク UnoAvalonia UI も選択肢として加わり、技術スタックが爆発的に増えています。

本日紹介するのは Avalonia UI です。サイト管理人が数日かけて調査したところ、これは WPF XAML ベースのクロスプラットフォーム UI フレームワークで、複数の OS(Windows(.NET Core)、Linux(GTK)、macOS、Android、iOS)および Web(WebAssembly)をサポートしています。

2. Avalonia UI デスクトップ三大プラットフォームのデモ

これは Avalonia UI 公式サイト のデモです。サイト管理人は一部の NuGet パッケージをアップグレードしました。また、ユーザー「小飛機MLA」が Linux 版のフォントバグを修正し、正常に動作・表示できるようにしました。

2.1 本記事のサンプル

音楽アルバムを検索・表示する小さなアプリケーション。機能は以下の通りです:

  • ホームページ: 購入済みの音楽アルバムを表示
  • アルバム選択ページ: アルバムの検索、購入

2.2 サンプル資料

サンプルチュートリアル: https://docs.avaloniaui.net/tutorials/music-store-app

サンプルソースコード(オリジナル): https://github.com/AvaloniaUI/Avalonia.MusicStore

サイト管理人がアップグレードしたソースコード: https://github.com/dotnet9/AvaloniaTest/tree/main/src/Avalonia.MusicStore

本記事のサンプル実行ファイルダウンロード: https://dotnet9.com/avalonia.musicstore/publish.html

2.3 サンプルデモ

Windows 11:

macOS 13:

Rider(EAP版で可)を使用して開発すれば、サイト管理人は一発でコンパイル・実行できました(サイト管理人は .NET 7 を使用)。実行・デバッグは非常にスムーズで、MAUI を使用したときとは信じられないほど快適でした。

国産キリンV10オペレーティングシステム

サイト管理人は キリンOS のインストールに少し手間取りました(ファイル転送に不慣れで、結局 Baidu ネットディスクを経由しました)。実行コマンドも不慣れで(実行プログラムにパーミッション777を設定する必要がありました)。その後、ユーザー「小飛機MLA」が Linux のフォント問題を解決してくれたおかげで、サイト管理人は喜んで実行し、ビデオを録画して共有することができました。

2.4 小さな欠点

3つのプラットフォームで機能は同じですが、Linux ではカスタムタイトルバーが機能しませんでした。ユーザーからは、タイトルバーを非表示にして、制御ボタン(最小化、最大化(復元)、閉じる)を自分で実装すればよいとのアドバイスがありました。今後、公式が Linux でこの問題を解決するはずです。引き続き研究・改良していきます!

3. Avalonia UI のその他の例

3.1 ユーザーの共有

以下の内容はブログ記事「Avalonia学習実践(二)--クロスプラットフォーム対応と公開」から引用しています。

3.1.1 サポートされるプラットフォーム

サポートされるプラットフォームの詳細は以下の通りです:

実行プラットフォーム バージョン
Windows Windows8 以降(Windows7 も使用可能だが、保証はしない)
macOS macOS High Serra 10.13 以降
Linux Debian 9、Ubuntu 16.5、Fedora 30 以降(主に各ディストリビューション)

モバイル端末のクロスプラットフォーム、すなわち iOS と Android のサポート。

Web サポート、すなわち WebAssembly(国際標準)。

3.1.2 Linux カーネルを使用する国産OSの状況

オペレーティングシステム 開発機関 備考
銀河麒麟 天津麒麟信息技術有限公司
中标麒麟 中标软件科技有限公司 元中标普華
統信UOS 統信软件科技有限公司
中科方德 中科方德软件有限公司
優麒麟 中国CCN联合實驗室 Ubuntu ベースのディストリビューション
深度(deepin) 武汉深之度科技有限公司 23版以降はKernelから構築

公開オプション:

テスト環境(統信UOS、AMDプロセッサのため linux-x64 を選択)への公開は以下の通り:

実行結果:

付録:国産CPU命令セットの系統

国産CPU 命令セット
龍芯 loongarch(サイト管理者注:ユーザーから loongarch と指摘あり、原文は MIPS
海光 x86
兆芯 x86
飛騰 arm
鲲鵬 arm
申威 Alpha

龍芯は完全に独自の命令セットであり、先日 .Net のサポートも更新されました。x86 は主にエコシステムが良好で、従来のデスクトッププロセッサである Intel や AMD は x86 アーキテクチャであり、互換性確保も容易です。arm は以前はモバイル端末が多かったですが、現在はデスクトップ端末も徐々に追いついてきています。

3.2 その他の例

例はリポジトリ Avalonia からのものです。

Avalonia ベースで構築されたプロジェクトの一部は以下の通りです:

3.2.1 Lunacy

無料のデザインソフトウェアで、AIツールと内蔵グラフィックスによりスムーズな動作を実現。

プロジェクトサイト: https://icons8.com/lunacy

以下はB站の動画からの引用: 「(転載/英語)Lunacy を使ってウェブサイトのトップページをデザイン!

3.2.2 Plastic

キャッチコピー: Create without compromise(妥協せずに創造する)

Unity Plastic SCM はバージョン管理およびソースコード管理ツールで、チームコラボレーションとあらゆるエンジンとの拡張性を高めるように設計されています。アーティストやプログラマー向けに最適化されたワークフローと、大規模ファイルやバイナリファイルを高速に処理する機能を提供します。

プロジェクトサイト: https://www.plasticscm.com/

3.2.3 WasabiWallet

デスクトップ向けのオープンソース、非管理型ビットコインウォレット。

プロジェクトサイト: https://www.wasabiwallet.io/

4. Avalonia UI と WPF

Maui のネイティブコントロールは、名前やプロパティリストを見るとネイティブ Android に似ていますが、XAML 構文は WPF と同じです。サイト管理人は Maui ネイティブコントロールをあまり使用していないため、表面的な見解にとどめ、コードは記載しません。Maui の学習はこちらを参照してください。

一方、Avalonia UIWPF とほぼ同じです。以下に原文「データバインディングのドキュメント」の翻訳を示します。WPF に詳しい方は比較してみてください:

コントロールへのバインディング

コントロールの DataContext にデータをバインドするだけでなく、他のコントロールにバインドすることもできます。

この操作を行う場合、バインディングソースはコントロール自体であり、コントロールの DataContext ではないことに注意してください。コントロールの DataContext にバインドする場合は、バインディングパスでそれを指定する必要があります。

4.1 名前付きコントロールへのバインディング

名前付きの別のコントロールのプロパティにバインドする場合は、コントロール名の前に # 文字を付けて使用できます(サイト管理人注:これはフロントエンドの cssid セレクタに似ています。Avalonia UI のスタイル拡張はフロントエンドから多くを借用しているとサイト管理人は推測しています)。

<TextBox Name="other">

<!-- Binds to the Text property of the "other" control -->
<TextBlock Text="{Binding #other.Text}"/>

これは、WPF や UWP に慣れたユーザーにはおなじみのロングフォームバインディングに相当します:

<TextBox Name="other">
<TextBlock Text="{Binding Text, ElementName=other}"/>

Avalonia は両方の構文をサポートしていますが、短い # 構文の方が冗長ではありません。

4.2 祖先へのバインディング

次の記号を使用して、ターゲットの論理的な親にバインドできます:$parent

<Border Tag="Hello World!">
  <TextBlock Text="{Binding $parent.Tag}"/>
</Border>

または、$parent 記号にインデックスを追加して、祖先に渡すこともできます:

<Border Tag="Hello World!">
  <Border>
    <TextBlock Text="{Binding $parent[1].Tag}"/>
  </Border>
</Border>

インデックスは 0 から始まるため、$parent[0]$parent と同じです。

型で祖先にバインドすることもできます:

<Border Tag="Hello World!">
  <Decorator>
    <TextBlock Text="{Binding $parent[Border].Tag}"/>
  </Decorator>
</Border>

最後に、インデックスと型を組み合わせることもできます:

<Border Tag="Hello World!">
  <Border>
    <Decorator>
    	<TextBlock Text="{Binding $parent[Border;1].Tag}"/>
    </Decorator>
  </Border>
</Border>

祖先の型に XAML 名前空間を含める必要がある場合は、通常通り : 文字を使用して行うことができます:

<local:MyControl Tag="Hello World!">
  <Decorator>
    <TextBlock Text="{Binding $parent[local:MyControl].Tag}"/>
  </Decorator>
</local:MyControl>

Avalonia は WPF/UWP の RelativeSource 構文もサポートしていますが、その機能は似ているものの同じではありませんRelativeSourceビジュアルツリーに適用されますが、ここで示した構文は論理ツリーに適用されます。

Avalonia UI の詳細な使用方法はこちらを参照してください。

5. JetBrains Rider のサポート

JetBrains Rider は現在、Avalonia を正式にサポートしています。 XAML プレビューアー、コード補完、インスペクション、リファクタリングのサポートが追加されました。プラグインリポジトリ https://plugins.jetbrains.com/plugins/dev/14839 から AvaloniaRider プラグインをインストールしてください。

6. よくある質問

翻訳元: Avalonia UI FAQ

6.1 XAML を使わずに UI を記述できますか?

はい。お好みの .NET 言語で UI 全体をコーディングできます。

6.2 ビジュアルなドラッグ&ドロップデザイナーはありますか?

ありません。Avalonia IDE 拡張機能はライブプレビューをサポートしており、XAML を編集するとリアルタイムで UI プレビューが更新されるため、ドラッグ&ドロップデザイナーを代替します。

6.3 Avalonia はホットリロードをサポートしていますか?

コミュニティプロジェクトを使用して、Avalonia のホットリロードを有効にすることができます。

6.4 Avalonia はネイティブ API と相互運用できますか?

はい。

6.5 異なるプラットフォーム向けにクロスコンパイルできますか?

はい。Windows プラットフォームで、macOS や Linux 向けのターゲットプログラムをコンパイルできます。これらのプラットフォームでアプリケーションをパッケージ化して、配布用のリリースパッケージを作成する必要がある場合があります。

6.6 Avalonia でモバイルアプリケーションを構築できますか?

はい。現在 Android 向けの開発が可能で、iOS サポートのプレビューも提供されています。ただし、各プラットフォームを慎重に検討し、アプリケーションが小さなタッチデバイスで適切に動作することを確認する必要があります。

6.7 Avalonia でウェブサイトを構築できますか?

まだ初期段階であり、本番環境での使用には適していませんが、可能です。Avalonia は現在 Web Assembly をサポートしています。簡単なデモをご参照ください: NodeEditor Demo。つまり、完全な Avalonia アプリケーションを最新のすべてのウェブブラウザで実行できます。

6.8 どのようにプロジェクトに参加できますか?

コミュニティガイドを参照して、プロジェクトへの参加方法を確認してください。

6.9 サポートされる Linux ディストリビューションは?

  • Debian 9 (Stretch)+
  • Ubuntu 16.04+
  • Fedora 30+

Skia は glibc に対してビルドされています。お使いのディストリビューションが別のものを使っている場合は、SkiaSharp を使用して独自の libSkiaSharp.so をビルドする必要があります。Intel x86-64 向けのプリコンパイル済みバイナリのみを提供しています。ARM/ARM64 のサポートを計画中です。

6.10 サポートされる macOS のバージョンは?

macOS High Sierra 10.13+

7. 学習資料

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2024/12/05

Avalonia 国際化への道:Resx リソースファイルの深い応用と探求

今日のグローバル化されたソフトウェア開発の流れにおいて、アプリケーションの国際化(i18n)とローカライゼーション(L10n)は特に重要です。Avalonia UI は強力なクロスプラットフォーム UI フレームワークとして、開発者にさまざまな国際化の方法を提供しています。その中でも、従来の Resx リソースファイルを使用した国際化処理は、Winform、WPF、ASP.NET Core などの開発シナリオでの使用習慣と互換性があるだけでなく、便利なツールと特定の開発フローを活用することで、国際化を効率的かつ整理された形で実現できます。

続きを読む
同じカテゴリ / 同じタグ 2026/01/11

AvaloniaのクリップボードとDataGridの問題

最近のAvaloniaデスクトップソフトウェア開発で解決した2つの問題を記録:クリップボードコピーのクラッシュ、タブ切り替え時のDataGridの遅延。根本原因を分析し、解決策を提供する

続きを読む
同じカテゴリ / 同じタグ 2025/09/13

WPF から Avalonia への移行シリーズ:なぜ WPF プログラムを Avalonia に移行しなければならないのか

過去数年間、当社の上位機ソフトウェアは主に WPF と WinForm で開発されてきました。これらの技術は Windows プラットフォームで非常に便利であり、小規模試作から現在の規模拡大による納品まで、私たちを支えてきました。しかし、ビジネスの発展や顧客ニーズの変化に伴い、単一の Windows テクノロジースタックは私たちが必ず乗り越えなければならない壁となってきました。

続きを読む