1. 程式人生 > >C# 判斷是否是在設計模式下有效的方法

C# 判斷是否是在設計模式下有效的方法

line 分享 block gem sem 當前 自己 dev out

  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 真的能判斷當前是否是設計時嗎??我們來做個小實驗,先寫一個測試控件:

技術分享public class TestControl : System.Windows.Forms.UserControl {
技術分享 public TestControl() {
技術分享 System.Windows.Forms.MessageBox.Show( this.DesignMode.ToString() );
技術分享 }
技術分享}


  然後我們把這個控件編譯拖拽到另外一個 UserControl : TestContainerA

  這個時候 TestControl.DesignMode 是 True
  我們再把這個 TestContainerA 編譯拖拽到一個新的用戶控件或窗體裏: TestContainerB
  這個時候彈出來的 TestControl.DesignMode 卻是 False !!

  真是個神奇的現象。。也就是說一個控件只有在它自己被拖拽到設計器的時候,其 DesignMode 才是真,如果它被包含在其他控件中被加入  到設計器,那麽那個控件才是在設計模式,而它不是!換句話說,DesignMode 並不能反映當前環境是否是運行時,它只能告訴你,這個控件當前是不是直接被設計器操作(嵌套的已經不算了)
  花了一個多小時才跟蹤發現這個錯誤技術分享...設計時控件的無法創建錯誤真是不好調試

  Thanks to jonnyyu,這個解釋比較容易理解和正確的:
  winform的Design環境是由控件的容器維護的。當控件嵌套在一個沒有design環境的容器空間中時其實就是運行時狀態。

C# 判斷是否是在設計模式下有效的方法