在开发控件时,是否有人找到了设计模式问题的有用解决方案?

问题是,如果嵌套控件,则DesignMode仅适用于第一级.第二级和更低级别的DesignMode将始终返回False.

标准的破解方法是查看正在运行的进程的名称,如果它是"DevEnv.EXE",那么它必须是studio,因此DesignMode是真的.

这样做的问题是,在注册表和其他奇怪的部分中查找进程名,最终结果是用户可能没有查看进程名所需的权限.此外,这条奇怪的路由非常慢.因此,我们不得不添加额外的黑客来使用singleton,如果在请求进程名时抛出错误,则假定DesignMode为FALSE.

一个确定设计模式的好方法是有序的.如果能让微软在框架内部修复它,那就更好了!

推荐答案

重新审视这个问题,我现在"发现"了5种不同的解决方法,它们如下:

System.ComponentModel.DesignMode property

System.ComponentModel.LicenseManager.UsageMode property

private string ServiceString()
{
    if (GetService(typeof(System.ComponentModel.Design.IDesignerHost)) != null) 
        return "Present";
    else
        return "Not present";
}

public bool IsDesignerHosted
{
    get
    {
        Control ctrl = this;

        while(ctrl != null)
        {
            if((ctrl.Site != null) && ctrl.Site.DesignMode)
                return true;
            ctrl = ctrl.Parent;
        }
        return false;
    }
}
public static bool IsInDesignMode()
{
    return System.Reflection.Assembly.GetExecutingAssembly()
         .Location.Contains("VisualStudio"))
}

为了try 理解提出的三个解决方案,我创建了一个小型测试解决方案-包含三个项目:

  • TestApp(WinForms应用程序),
  • 子控件(DLL)
  • Sub子控件(DLL)

然后,我将SubSubControl嵌入到SubControl中,然后将每个嵌入到TestApp.Form中.

此屏幕截图显示了运行时的结果. 运行截图

此屏幕截图显示了在Visual Studio中打开表单后的结果:

不 run 截图

结论:without reflection似乎是唯一可靠的within建造商是许可使用的,而唯一可靠的outside建造商是"IsDesignedHosted"(以下BlueRaja)

PS:请参阅ToolmakerSteve下面的 comments (我还没有测试):"注意,IsDesignerHosted个答案已经更新,包括LicenseUsage…,所以现在测试可以是if(IsDesignerHosted).另一种方法是test LicenseManager in constructor and cache the result."

.net相关问答推荐

如何处理以用户为中心的CSP现时值?(uc-lock.bundle.js)

Visual Studio 2022 中的目标操作系统和目标运行时有什么区别?

如何在 C# 中将 HTTP 发布请求发送到另一个 API?

您可以为 Func 或 Action 类型的函数或子参数指定默认值吗?

我在哪里可以获得线程安全的 CollectionView?

根源是什么?

value 的默认参数必须是编译时间常数?

将 int 转换为 .NET 中的位数组

使用 Windows 服务和 C# 检测 USB 驱动器插入和移除

将屏幕捕获为位图

ReaderWriterLock 与锁{}

运算符重载 ==, !=, Equals

您可以在 C# 代码中捕获本机异常吗?

使用 XmlDocument 读取 XML 属性

在生产环境中部署调试符号(pdb 文件)有什么风险?

自创建数据库以来,支持ApplicationDbContext上下文的模型已更改

为什么要使用 C# 类 System.Random 而不是 System.Security.Cryptography.RandomNumberGenerator?

DataContractSerializer vs XmlSerializer:每个序列化器的优缺点

对构造函数进行单元测试重要吗?

功能说明