如何阻止Visual Studio在我的UserControl中生成Setter调用?

本文关键字:Setter 调用 UserControl Visual 何阻止 Studio 我的 | 更新日期: 2023-09-27 17:51:23

我已经为我的Winform应用程序创建了两个继承自UserControl的控件。根据需要,它们都具有无参数构造函数。当我把它们放到主表单上时,我在设计时在Visual Studio中得到一个错误,它无法渲染表单。

我发现的是,在表单的Designer.cs文件中,我的控件实例化的地方,IDE在那里放置了一行调用我的setter之一。BlockKey = 0。setter后面的代码调用了其他代码,很快抛出了NullReferenceException因为表单没有运行;此时,其他代码还没有准备好生成任何东西。

如果我手动删除setter行,错误就会消失。但是关闭并重新打开或重新编译时,IDE会再次将该行放回原处。我尝试在UserControl内部用[DefaultValue(false)]装饰setter,认为这会抑制对setter的设计时调用,但它没有。

如何在设计器中删除该行?或者我应该在setter中编写一些预防性代码?

如何阻止Visual Studio在我的UserControl中生成Setter调用?

您应该在您的属性上使用DesignerSerializationVisibilityAttribute属性并将其设置为Hidden

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int BlockKey
{
    get { return 0; }
    set { /* Do something */ }
}

或者,如果你需要更具体的逻辑(即只在某些条件下序列化),那么你必须创建一个函数,返回一个bool值,并具有bool ShouldSerialize*PropertyName*()格式的特定名称

bool ShouldSerializeBlockKey()
{
     return false;
}

(注意:我忘了这个函数是否必须是公共的…)

你要找的是DesignerSerializationVisibilityAttribute。这控制设计器是否序列化特定属性的默认

如果您指定属性为Hidden,设计器将不会为它们添加值