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

3

我正在努力学习并掌握C#的工作原理。我历史上是Visual Foxpro(VFP)开发人员,经历了多年的视觉继承,通过创建自己的用户控件基准来广泛应用。

在尝试了解C#中的相似之处时,我遇到了问题。例如,我派生了自己的标签控件(控件是标签的子类),定义了字体“Arial”,10点大小。然后,在任何我添加它的窗体上,设计器将自动预先填充一些属性值,这些值可以在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#中,我必须返回并更改每个表单,使其被新/更新的类值所识别...
有没有合理的方法可以避免这种情况?
3个回答

4

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


尽管其他人的评论适用于只读,但可能会有一些超越默认值的情况,因此我喜欢你关于[DefaultValue(somevalue)]选项的评论。然而,我在尝试返回字体时遇到了错误。(somevalue)期望一个常量而不是一个新对象。 - DRapp
尝试这个:[DefaultValue(typeof(Font), "Microsoft Sans Serif, 10 pt")](来自此网址:http://social.microsoft.com/Forums/en-US/netfxbcl/thread/9acb9a96-d461-4732-b99c-65390b4b53fa) - David
不行... 这仍然会在页面中创建它... this.defLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));我想我现在会坚持使用只读选项。 - DRapp

3

这里有一个简单的解决方案,使用派生类中的ReadOnlyAttribute

class MyLabel : Label
{
    [ReadOnly(true)]
    public override Font Font
    {
        get { return new Font(FontFamily.GenericMonospace, 10); }
        set { /* do nothing */ }
    }
}
ReadOnlyAttribute 可以禁用 VS.NET 设计器中的属性编辑。

1
尝试将只读属性添加到您的派生类属性中:
[ReadOnly(true)]
public override Font Font
{
    get{ // Your Implementation Here }
    set{ // Don't really care,do you? }
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接