当用户控件在公共属性上具有Browsable false时,为什么设计器在添加到表单时将其设置为null?

Jef*_*eff 12 c# user-controls visual-studio-2008 winforms

我有一个具有一些公共属性的用户控件,一个是我设置[Browseable(false)]的对象.当我在Visual Studio的设计器中添加此控件时,生成的代码将此对象设置为null.

public class Foo : System.Windows.Forms.UserControl
{
    [Browsable(false)]
    public object Bar { get; set; }

    [Browsable(true)]
    public bool IsSomething { get; set; }

    ...
}

private void InitializeComponent()
{
    ...
    this.foo = new Foo();

    this.foo.IsSomething = false;
    this.foo.Bar = null;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么Visual Studio会这样做,我很好奇是否有一种方法来标记它,以便它不设置它.我通过将对象设置为构造函数中的某些内容来发现这一点,只是为了观察控制器的父对象将其设置为null.

Dav*_*son 20

这里有几个选择.首先,BrowsableAttribute仅确定属性是否显示在属性网格中.要防止属性完全序列化,请使用DesignerSerializationVisibilityAttribute:

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public object Bar { get; set; }
Run Code Online (Sandbox Code Playgroud)

其次,如果您希望序列化属性,但仅当用户实际更改了值时,请使用DefaultValueAttribute:

[Browsable(true)]
[DefaultValue(false)]
public bool IsSomething { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将导致属性仅在与其默认值不同时才被序列化.这也有其他积极的副作用

  1. 属性值在未更改时以普通字体显示,但在更改后以粗体显示.
  2. 右键单击属性网格中的属性时,"重置"选项将可用.

有更多先进的技术可以控制与设计师的交互(Google"ShouldSerialize"),但这些属性应该可以帮助你完成大部分工作.