Avalonia剪貼板和DataGrid的問題

Avalonia剪貼板和DataGrid的問題

記錄最近 Avalonia 桌面軟體開發解決的兩個問題:剪貼板複製崩潰、Tab 切換 DataGrid 卡頓,分析根因並給出解決方案

最後更新 2026/1/11 下午12:23
沙漠尽头的狼
預計閱讀 4 分鐘
分類
.NET Avalonia UI
標籤
.NET C# Avalonia UI 桌面開發 Avalonia

記錄下最近基於 Avalonia 開發桌面應用時遇到並解決的兩個典型問題,希望能給遇到同類問題的開發者提供參考。

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 個欄位);
  • 執行環境為 Win7/Windows Server 2019,Win10 同事回報也卡;
  • 現象:Debug 模式切換 Tab 卡頓約 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)在老系統(Win7/Server)+AOT 發佈環境下易暴露效能問題,優先選擇官方新元件可減少踩坑,切記:及時更新最新控制項庫。

最後感謝 Avalonia 交流群的群友提供的解決方案,開源社群的交流總能快速定位這類“反直覺”的問題~

繼續探索

延伸閱讀

更多文章