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環境的容器空間中時其實就是運行時狀態。
