我有一个具有一些公共(public)属性的用户控件,其中一个是我设置 [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;
...
}
我不明白为什么 Visual Studio 想要这样做,我很好奇是否有办法标记它以便它不设置它。我通过将对象设置为构造函数中的某物来发现这一点,只是为了观察控件的父级将其设置回 null。
最佳答案
这里有几个选项。首先,BrowsableAttribute 仅确定属性是否显示在属性网格中。要完全防止属性被序列化,请使用 DesignerSerializationVisibilityAttribute:
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public object Bar { get; set; }
其次,如果您希望属性被序列化,但仅当用户实际更改了值时,请使用 DefaultValueAttribute:
[Browsable(true)]
[DefaultValue(false)]
public bool IsSomething { get; set; }
这将导致属性只有在不同于其默认值时才被序列化。这还有其他积极的副作用
- 属性值在未更改时以普通字体显示,但在更改后以粗体显示。
- 在属性网格中右键单击属性时,“重置”选项将可用。
有更高级的技术可以控制与设计器的属性交互(Google“ShouldSerialize”),但这些属性应该可以帮助您完成大部分工作。
关于c# - 当用户控件在公共(public)属性上具有 Browsable false 时,为什么设计器在将其添加到表单时将其设置为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/889424/