gpt4 book ai didi

.net - 带有嵌套控件的设计模式

转载 作者:行者123 更新时间:2023-12-03 05:05:26 24 4
gpt4 key购买 nike

有人在开发控件时找到了解决 DesignMode 问题的有用解决方案吗?

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

标准的黑客方法是查看正在运行的进程的名称,如果它是“DevEnv.EXE”,那么它一定是 studio,因此 DesignMode 确实是 TRUE。

问题是通过注册表和其他奇怪的部分寻找 ProcessName,最终结果是用户可能没有查看进程名称所需的权限。另外这条奇怪的路线非常慢。因此,我们必须堆砌额外的技巧来使用单例,并且如果在询问进程名称时抛出错误,则假设 DesignMode 为 FALSE。

一种确定 DesignMode 的简洁方法是合适的。实际上让微软在框架内部修复它会更好!

最佳答案

重新审视这个问题,我现在“发现”了 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"))
}

为了尝试掌握所提出的三个解决方案,我创建了一个小测试解决方案 - 包含三个项目:

  • TestApp(winforms 应用程序),
  • 子控件(dll)
  • SubSubControl (dll)

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

此屏幕截图显示了运行时的结果。 Screenshot of running

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

Screenshot of not running

结论:没有反射,构造函数内部唯一可靠的就是LicenseUsage,而构造函数外部唯一可靠的就是LicenseUsage。 em> 构造函数是“IsDesignedHosted”(由下面的 BlueRaja 提供)

PS:请参阅下面 ToolmakerSteve 的评论(我尚未测试过):“请注意 IsDesignerHosted 答案已更新为包含 LicenseUsage...,因此现在测试可以简单地为 if (IsDesignerHosted)。另一种方法是test LicenseManager in constructor and cache the result。”

关于.net - 带有嵌套控件的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com