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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM