【RaspberryPi】Mono + WinFormsでBorderの色や角丸が反映されない問題の解決策と、Avalonia UIへの移行

C#

導入

Raspberry Pi上でMonoを使用してC#(Windows Forms)アプリを動作させた際、デザイン面で以下のような挙動に悩まされました。

  • Borderの色を何に指定しても、すべて黒色で描画される。
  • カスタムコントロールで実装した「角丸」が無視され、四角形のままになる。

原因:Monoの描画エンジン(libgdiplus)の限界

この問題の主な原因は、MonoがLinux上で描画を行う際に使用するlibgdiplusと、Linuxの画面システム(X11)の互換性にあります。

  • 互換性の欠如: Windows FormsはWindows OS固有のGDI+に依存しており、Monoによる変換では高度な視覚スタイルやプロパティ(特にBorderのレンダリング)が完全には再現されません。
  • 描画命令の単純化: 複雑な描画(角丸のリージョン処理など)がOS側の制限でデフォルト設定(黒色・矩形)にリセットされてしまうことがあります。

根本的な解決策:Avalonia UI への移行

UIの自由度とクロスプラットフォームでの完全な再現性を求め、**Avalonia UI(.NET 6/8以降)**へ移行することにしました。

なぜ Avalonia UI なのか?

比較項目Mono (Windows Forms)Avalonia UI
描画方式OSの描画機能に依存独自のレンダリングエンジン (Skia)
見た目OS(Linux/X11)に左右される全プラットフォームで同一
角丸・装飾実装が困難(バグが出やすい)CornerRadius等で標準対応
開発手法プロパティ・コードXAMLベース(モダンな設計)

コメント