gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:35:57 25 4
gpt4 key购买 nike

我正在制作 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、默认 Width、默认字体 Style ,默认字体 sizeBorderStyle。除了 Width 属性之外的所有属性都不应具有默认值以外的其他值。

最佳答案

首先,您应该为构造函数中的属性提供合适的默认值。然后你应该重写或隐藏属性并用这些属性之一装饰它们:

代码

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

关于c# - 创建自定义 Windows 窗体控件的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37399454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com