我正在制作C#Windows窗体应用程序,它有许多使用许多文本框和相同属性和样式的标签的表单。
我没有更改每个文本框和每个标签的属性,而是创建了一个名为MyTextBox
的类,它继承自System.Windows.Forms.TextBox
,然后在类构造函数中更改了它的属性,如下所示:
class MyTextBox:TextBox
{
public MyTextBox()
{
this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.Font = new System.Drawing.Font("Bookman Old Style", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ForeColor = System.Drawing.Color.Blue;
this.Size = new System.Drawing.Size(257, 23);
}
}
在工具箱中出现构建项目类之后,通过在我的表单上创建此类的实例,它工作正常。
问题是当我更改MyTextBox
类中的任何属性并重建项目时,更改不适用于已经实例化的对象,当我查看设计器代码时,我发现IDE复制了{的所有属性{1}}设计器代码的类,因此我必须在更改类代码后重新创建所有实例。
MyTextBox
有什么方法可以解决这个问题吗?我希望对应用于所有已实例化对象的类代码进行任何更改,而无需重新创建它们,或者如果有更好的方法请帮助。
假设我需要控制private void InitializeComponent()
{
this.MyTextBox1 = new WindowsFormsApplication9.MyTextBox();
this.SuspendLayout();
//
// MyTextBox1
//
this.MyTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.MyTextBox1.Font = new System.Drawing.Font("Bookman Old Style", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.MyTextBox1.ForeColor = System.Drawing.Color.Blue;
this.MyTextBox1.Location = new System.Drawing.Point(67, 43);
实例的5个属性,例如MyTextBox
,默认ForeColor
,默认字体Width
,默认字体Style
和{{ 1}}。除了size
属性之外的所有属性都不应该具有除默认值之外的其他值。
答案 0 :(得分:4)
首先,您应该为构造函数中的属性提供合适的默认值。然后你应该覆盖或遮蔽属性并使用以下属性之一来装饰它们:
[DefaultValue]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
<强>代码强>
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public partial class MyTextBox : TextBox
{
public MyTextBox()
{
this.ForeColor = Color.Red;
this.Font = new Font("Tahoma", 9, FontStyle.Italic);
this.Width = 200;
}
[DefaultValue(typeof(Color), "Red")]
public override Color ForeColor
{
get { return base.ForeColor; }
set { base.ForeColor = value; }
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override Font Font
{
get { return base.Font; }
set { base.Font = value; }
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new Size Size
{
get { return base.Size; }
set { base.Size = value; }
}
}
在上面的示例中,我创建了一个具有以下功能的自定义TextBox
:
ForeColor
的默认值为Color.Red
。如果在控件实例中更改ForeColor
的值,则将序列化该值。如果更改了类中的默认值,则只有那些ForeColor
未触及的实例才会使用新的默认值,其他实例将使用其ForeColor
值。Font
的默认值为new Font("Tahoma", 9, FontStyle.Italic)
,因为我们告诉设计人员不要序列化Font
属性,如果更改了属性值,则不会保存属性的新值不同的实例和所有实例都将使用在MyTextBox
。Width
哪个用户无法使用设计器更改它,我覆盖了Size
并说设计师没有将其序列化,因此宽度将设置为默认Width
我在构造函数中设置。答案 1 :(得分:0)