zoukankan      html  css  js  c++  java
  • 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环境的容器空间中时其实就是运行时状态。 

  • 相关阅读:
    5种类型的程序猿
    cocos2dx 关于lua 绑定的环境配置官方文档翻译与 将自己定义c++方法绑定到lua的的方法
    智能聊天机器人实现(源代码+解析)
    storm trident merger
    分析Redis架构设计
    Spring+Struts+Hibernate 简介(转)
    java面试题(开发框架)
    Jsp+Servlet+JavaBean经典MVC模式理解
    Loadrunner中影响"响应时间"的设置
    phpredis中文手册——《redis中文手册》 php版(转)
  • 原文地址:https://www.cnblogs.com/shaozhuyong/p/6830244.html
Copyright © 2011-2022 走看看