![](/img/trans.png)
[英]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.