首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF Bug 系列 (6):模態對話框隱藏後再次 ShowDialog 導致 IsCancel 按鈕失效

     編輯:關於.NET

前情提要

上一篇發現模態視窗 Visibility.Hidden 後再 Visible 會失去模態特性。微軟原始碼在 DoDialogHide 中將 _showingAsDialog = false,導致後續判斷錯誤。解決方案是隱藏後再次呼叫 ShowDialog 而非設 Visibility。

本篇 Bug:IsCancel 失效

使用上篇相同代碼:

  1. 點擊「Show Model Dialog」 → 模態視窗彈出
  2. 點擊視窗上「Hide Self」按鈕(IsCancel="True") → 視窗關閉
  3. 再次點擊「Show Model Dialog」 → 視窗彈出
  4. **按 ESC 或點擊按鈕無反應,IsCancel 完全失效**

原始碼分析

ShowDialog 內部透過 ComponentDispatcher.PushModal / Dispatcher.PushFrame 實現模態。第二次呼叫時,內部旗標狀態不一致,導致取消命令未正確路由。

結語

WPF Window 狀態機設計存在多處邏輯缺陷,開發者需避免「隱藏-顯示」模式,嚴格使用 ShowDialog/Close 配對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved