我创建了一些从UserControl继承Winform应用程序的控件。根据需要,它们都具有无参数构造函数。当我将它们放到我的主窗体上时,我在设计时在Visual Studio中遇到错误,它无法呈现窗体。
我发现,在我的控件实例化的表单的Designer.cs文件中,IDE在那里调用一个调用我的一个setter的行。 BlockKey = 0
。好吧,setter背后的代码是调用其他代码,很快就会抛出NullReferenceException,因为表单没有运行;其他代码不准备在那时产生任何东西。
如果我手动删除了设定行,则错误消失。但是关闭并重新打开或重新编译,IDE会重新启动该行。我尝试在UserControl中使用[DefaultValue(false)]
进行装饰,认为这会抑制对setter的设计时调用,但事实并非如此。
如何摆脱Designer中的那一行?或者我希望在setter中写一些预防性代码呢?
答案 0 :(得分:3)
您应该使用属性中的DesignerSerializationVisibilityAttribute
属性并将其设置为Hidden
。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int BlockKey
{
get { return 0; }
set { /* Do something */ }
}
或者,如果您需要更具体的逻辑(即仅在某些条件下序列化),那么您必须创建一个返回bool并具有bool ShouldSerialize*PropertyName*()
bool ShouldSerializeBlockKey()
{
return false;
}
(注意:我忘记了这个功能是否必须公开......)
答案 1 :(得分:2)
您正在寻找的是DesignerSerializationVisibilityAttribute
。这可以控制设计人员是否会为特定属性序列化默认值
如果您将属性指定为Hidden
,则设计人员不会为其添加值