[英]UseCompatibleTextRendering property not created by designer when it is set to false
[英]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; }
这将导致属性仅在与其默认值不同时才被序列化。 这也有其他积极的副作用
有更多先进的技术可以控制与设计师的交互(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.