Avalonia ClipboardとDataGridの問題点

Avalonia ClipboardとDataGridの問題点

Avaloniaデスクトップソフトウェアの最近の開発で解決された2つの問題を文書化します:クリップボードのコピーのクラッシュ、タブの切り替えDataGridのキートン、原因の分析と解決策

最后更新 2026/01/11 12:23
沙漠尽头的狼
预计阅读 3 分钟
分类
.NET Avalonia UI
标签
.NET C# Avalonia UI デスクトップの開発 Avalonia

Avaloniaベースのデスクトップアプリケーションを開発する際に最近遭遇し、解決した2つの典型的な問題を記録し、同様の問題に直面している開発者に参考にすることを願っています。

1. クリップボードコピー例外AOTクラッシュ/デバッグドCOM例外

問題の現象。

项目中对TextBoxSelectedTextBlock控件的文本执行Ctrl+C复制操作时,出现两种异常表现:

  • AOTパブリッシュランナーが直接クラッシュし、アプリケーションイベントを表示します。

  • Debug调试模式下,未捕获全局异常,ProgramMain函数会抛出明确的COM异常:
System.Runtime.InteropServices.COMException:“尚未调用 CoInitialize。 (0x800401F0 (CO_E_NOTINITIALIZED))”

原因は位置。

排查代码后发现核心问题出在Program.csMain函数定义上——将入口函数声明为async Task类型,而非Avalonia要求的同步:

async Task改为void修复,Avalonia 文档:Application Lifetimes 其实有说明:

原理分析の原理

Avalonia作为桌面UI框架,对主线程的SynchronizationContext(同步上下文)有强依赖,剪贴板、窗口消息循环等系统级操作均需基于稳定的主线程上下文执行。

  • async Task Main会让CLR以异步方式管理主线程生命周期,破坏Avalonia初始化的同步上下文,导致剪贴板操作时触发CoInitialize未调用的COM异常;
  • Avalonia官方文档明确说明:应用入口阶段(Main函数)不应依赖未就绪的SynchronizationContext,因此入口函数必须为同步。

2. Tab切り替えDataGridカートン

問題の場面

项目使用Dock控件(VS风格布局,Document等价于TabControl的TabItem),在Document中嵌入DataGrid展示数据:

  • データ量は非常に少ない(数十、8-9フィールド)。
  • 実行環境はWin 7/Windows Server 2019で、Win 10同僚からのフィードバックもカードです。
  • 現象:デバッグモード切り替えタブカトンは約2秒、AOTリリース後3-4秒に悪化します。
  • 对比:单窗口直接展示DataGrid加载几十万条数据(15个字段)时,实时刷新很流畅。

審査プロセスの検証

  1. 初期怀疑DataGrid使用方式问题:优化列绑定(仅单向绑定)、移除复杂样式/动画,卡顿无明显改善;
  2. Dockコントロールのパフォーマンスの問題が疑われる:Dockコントロールのバージョンを更新し、古いバージョンを切り替えます。
  3. 排除Dock控件影响:改用原生TabControl测试,卡顿问题复现;
  4. 社区求助:在Avalonia交流群反馈后,群友提示尝试TreeDataGrid替代DataGrid,替换后卡顿问题完全解决。

DataGrid是早期移植的WPF(链接指Silverlight)风格组件,“Cell级控件+被动虚拟化”的设计在小数据量+Tab切换重建时,控件实例化/布局开销被Win7/AOT环境放大;而TreeDataGrid是Avalonia团队重构的新组件,“行级渲染+强制虚拟化”的设计从根源上降低了切换开销,且官方已明确推荐使用TreeDataGrid替代DataGrid,讨论请点击链接

这里要明确,TreeDataGrid已被Avalonia放入商用套件

使用免费版,必然会有新发现Bug得不到修复的情况(官方把旧版维护推给了开源社区分支),Avalonia.Controls.TreeDataGrid免费版可使用11.1.1及以前版本:

Semi提供的配套主题库对应版本为11.1.1.1

まとめまとめまとめ

  1. Avalonia入口函数Main必须声明为同步,async Task会破坏同步上下文,导致剪贴板等系统级操作异常;
  2. DataGrid在Tab切换场景下存在性能短板,优先使用官方推荐的TreeDataGrid可解决卡顿问题;
  3. Avaloniaの古いコンポーネント(DataGridなど)は、古いシステム(Win 7/Server)+AOTリリース環境でパフォーマンスの問題にさらされやすく、公式の新しいコンポーネントを優先することでピットを減らすことができます。

最後に、Avaloniaコミュニティの友人が提供したソリューションのおかげで、オープンソースコミュニティのコミュニケーションは常にこのような“直感に反する”問題を迅速に特定します。

Keep Exploring

延伸阅读

更多文章