public static bool IsDesignMode() { bool returnFlag = false; #if DEBUG if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) { returnFlag = true; } else if (Process.GetCurrentProcess().ProcessName == "devenv") { returnFlag = true; } #endif return returnFlag; }
WinForm里每個Control對象都有 DesignMode 屬性,可以判斷是否是在設計時。
但 DesignMode 真的能判斷當前是否是設計時嗎??我們來做個小實驗,先寫一個測試控件:





然后我們把這個控件編譯拖拽到另外一個 UserControl : TestContainerA
這個時候 TestControl.DesignMode 是 True
我們再把這個 TestContainerA 編譯拖拽到一個新的用戶控件或窗體里: TestContainerB
這個時候彈出來的 TestControl.DesignMode 卻是 False !!
真是個神奇的現象。。也就是說一個控件只有在它自己被拖拽到設計器的時候,其 DesignMode 才是真,如果它被包含在其他控件中被加入 到設計器,那么那個控件才是在設計模式,而它不是!換句話說,DesignMode 並不能反映當前環境是否是運行時,它只能告訴你,這個控件當前是不是直接被設計器操作(嵌套的已經不算了)
花了一個多小時才跟蹤發現這個錯誤...設計時控件的無法創建錯誤真是不好調試
Thanks to jonnyyu,這個解釋比較容易理解和正確的:
winform的Design環境是由控件的容器維護的。當控件嵌套在一個沒有design環境的容器空間中時其實就是運行時狀態。