我在这里了解了DesignMode How to refresh a winform custom control at design time after changing a property
但是当我在我的自定义控件的构造函数中使用它时,它永远不会返回true,因此当我拖放我的自定义控件时,它总是显示max = 200,那么是什么问题?
if (this.DesignMode)
{
this.Min = 0;
this.Max = 100;
}
else
{
this.Min = 0;
this.Max = 200;
}
this.LabMin.Text = this.Min.ToString();
this.LabMax.Text = this.Max.ToString();
答案 0 :(得分:38)
LicenseManager.UsageMode
就是为此目的。
实际上,它是检测控件是否处于设计模式的唯一可靠方法。它仅在构造函数期间有效,但它可以很容易地存储在类的字段中以供以后参考。
即使容器控件处于设计模式,嵌套控件的DesignMode
属性也将为false。
答案 1 :(得分:4)
控件必须还必须与ISite
相关联,否则它将始终返回false
设计模式指示器存储在 ISite;因此,如果组件 没有与之相关的ISite 它,这个属性的价值是 假的。
来源:MSDN
修改:另请参阅此帖子,因为有人遇到与您面临的问题类似的问题
Windows Forms designer and DesignMode property issues
编辑2 :我还发现一个网站似乎表明这是自定义控件的常见问题,但它也列出了一些解决方法。你可以在这里找到它:
答案 2 :(得分:3)
对于我在Ctor中记得的内容,DesignMode属性还没有它的价值。您应该在initializeComponents之后或在事件处理程序中使用它。
答案 3 :(得分:0)
对于涉及此主题的任何人,还有另一种处理方式。
如果为winforms控件实现ISupportInitialize,则设计器代码将调用控件的开始/结束初始化。
然后,对于所有设计时和运行时更改,您都可以在EndInitialization方法中进行调整。到那时,Site.DesignMode属性将被设置为True / False。
我还喜欢添加一个类级别的布尔值,即bool _initializing = false;这样我就可以在其他地方跟踪该状态。
这似乎是处理此类问题的最“卑鄙”的方式。