繁体   English   中英

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

[英]When a user control has Browsable false on public property, why does designer set it to null when added to a form?

我有一个具有一些公共属性的用户控件,一个是我设置[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”),但这些属性应该可以帮助你完成大部分工作。

通常,当您在自定义控件的构造函数中设置值时,VS设计器将生成代码,用于设置您在构造函数中设置的所有值。 IE:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
        this.Person = new Person
        {
            FirstName = "John",
            LastName = "Doe",
            Age = 45
        };
    }


    [Browsable(false)]
    public Person Person { get; set; }
}

当我将MyTextBox添加到我的表单时,这是生成的代码:

// 
// myTextBox1
// 
this.myTextBox1.Location = new System.Drawing.Point(149, 91);
this.myTextBox1.Name = "myTextBox1";
person1.Age = 45;
person1.FirstName = "John";
person1.LastName = "Doe";
this.myTextBox1.Person = person1;
this.myTextBox1.Size = new System.Drawing.Size(100, 20);
this.myTextBox1.TabIndex = 3;

但是,如果您对构造函数进行了更改,则需要重新构建项目,并且在许多情况下从表单中删除控件并重新添加它,以便VS可以重新生成代码。 我猜你的情况就是VS还没有赶上你的改变。 尝试从窗体中删除控件并重新生成控件。 然后重新添加它,它应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM