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

标签 c# winforms visual-studio-2008 user-controls

我有一个具有一些公共(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; }

这将导致属性只有在不同于其默认值时才被序列化。这还有其他积极的副作用

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

有更高级的技术可以控制与设计器的属性交互(Google“ShouldSerialize”),但这些属性应该可以帮助您完成大部分工作。

关于c# - 当用户控件在公共(public)属性上具有 Browsable false 时,为什么设计器在将其添加到表单时将其设置为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/889424/

相关文章:

c# - 带接口(interface)的 EF7 导航属性

c# - 选定的行不会在 DataGridView 中更新

c++ - 如何在解决方案中跨项目使用全局变量?

c# - 将列表分配给列表框时,未将对象引用设置为对象实例异常

.net - Control.EndInvoke 为异常重置调用堆栈

c++ - 如何使用 IGlobalInterfaceTable 传递接口(interface)指针?

c++ - 判断一个lib文件是否为2010 Build

c# - 如何在C#中将参数传递给线程

c# - 如何更新 ComboBox

c# - 每个循环的 C# 以什么顺序迭代 List<T>?