我正在制作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将所有属性从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);
有什么办法解决这个问题?我希望对应用于所有已经实例化的对象的类代码进行任何更改,而无需重新创建它们,或者如果有更好的方法,请提供帮助。
假设我需要控制MyTextBox
实例的5个属性,例如ForeColor
,default Width
,default Font Style
,default Fontsize
和BorderStyle
。除Width
属性外,所有其他属性均不应具有默认值以外的其他值。
首先,您应该为构造函数中的属性提供适当的默认值。然后,您应该覆盖或阴影属性,并使用以下属性之一装饰它们:
[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
在构造函数中设置的默认值。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句