如何防止覆盖的WinForm控件中的“默认”值?

时间:2009-03-12 02:56:00

标签: c# controls default subclass

我正在努力学习并掌握C#的功能和方式。我是历史上一个Visual Foxpro(VFP)开发人员,通过创建我自己的应用程序范围的用户控件基线,在视觉继承方面有点被宠坏了。

在尝试学习C#中的相似之处时,我陷入困境。假设我派生自己的标签控件(控件是标签的子类),用字体“Arial”定义,10分。然后,在我添加到的任何表单上,Designer将自动预填充一些属性值,这些属性值可以在Form类的“Designer.cs”部分中看到。

this.LabelHdr2.AutoSize = true;
this.LabelHdr2.Font = new System.Drawing.Font("Arial", 14F, System.Drawing.FontStyle.Bold);
this.LabelHdr2.ForeColor = System.Drawing.Color.Blue;
this.LabelHdr2.Location = new System.Drawing.Point(150, 65);
this.LabelHdr2.Name = "LabelHdr2";
this.LabelHdr2.Size = new System.Drawing.Size(158, 22);
this.LabelHdr2.TabIndex = 5;
this.LabelHdr2.Text = "LabelHdr2";

我想防止每次在表单上放置控件时生成Font,Color,Size,AutoSize等内容。如果我后来决定将字体从“Arial”10更改为“Tahoma”11,我将不得不返回所有表单(以及其他任何自定义控件)并进行编辑以进行切换。

在VFP中,如果我更改了基类的任何内容,则所有表单都会自动识别更改。我没有必要编辑任何东西(除了通过大小调整影响可能的对齐)...但是颜色,字体和其他所有内容在VFP中都没有问题......

在C#中,我必须返回并更改每个表单,以便通过类的新/更新值识别它...

有合理的方法可以避免这种情况吗?

3 个答案:

答案 0 :(得分:4)

请尝试使用“DefaultValueAttribute”代替“ReadOnlyAttribute”。如果我没记错的话,如果当前值与“DefaultValueAttribute”中存储的值匹配,设计者不应该创建代码来设置属性。

答案 1 :(得分:3)

以下是使用派生类中的ReadOnlyAttribute的简单解决方案。

class MyLabel : Label
{
    [ReadOnly(true)]
    public override Font Font
    {
        get { return new Font(FontFamily.GenericMonospace, 10); }
        set { /* do nothing */ }
    }
}

ReadOnlyAttribute将禁用VS.NET设计器中的属性编辑。

答案 2 :(得分:1)

尝试将ReadOnly attribute添加到派生类的属性中:

[ReadOnly(true)]
public override Font Font
{
    get{ // Your Implementation Here }
    set{ // Don't really care,do you? }
}

ReadOnlyAttribute应该在设计时强制执行ReadOnly行为。