创建自定义Windows窗体控件的最佳方法是什么?

时间:2016-05-23 19:56:30

标签: c# winforms

我正在制作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属性之外的所有属性都不应该具有除默认值之外的其他值。

2 个答案:

答案 0 :(得分:4)

首先,您应该为构造函数中的属性提供合适的默认值。然后你应该覆盖或遮蔽属性并使用以下属性之一来装饰它们:

<强>代码

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)

设置文件应该可以执行您想要的操作。在项目中创建一个新的设置文件(如果尚不存在),并添加如下的新设置:

enter image description here

然后在您的自定义TextBox覆盖OnCreateControl

protected override void OnCreateControl() {
    base.OnCreateControl();
    ForeColor = Settings.Default.TextBox_ForeColor;
}

现在,您可以更改设置文件中的ForeColor,更改将级联到自定义TextBox的所有实例。遵循FontSize等相同的模式,只需确保在设置文件中设置正确的Type

相关问题