3

我正在尝试学习和掌握 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";

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

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

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

有没有合理的方法来避免这种情况?

4

3 回答 3

4

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

于 2009-03-12T04:28:26.780 回答
3

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

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

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

于 2009-03-12T03:42:33.850 回答
1

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

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

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

于 2009-03-12T03:40:58.580 回答