如何设置设计时属性默认值?

时间:2012-03-16 03:19:53

标签: c# .net winforms

根据MSDN(http://msdn.microsoft.com/en-us/library/system.windows.forms.label.autosize.aspx),有一条关于Label AutoSize财产的说明:

  

使用设计器添加到表单时,默认值为true。从代码实例化时,默认值为false。

问题是:如何覆盖Label控件并将其AutoSize属性的设计时默认值设置为false

(更新)

这不起作用:

class MyLabel : Label
{
    const bool defaultAutoSize = false;

    public MyLabel()
    {
        AutoSize = defaultAutoSize;
    }

    [DefaultValue(defaultAutoSize)]
    public override bool AutoSize
    {
        get
        {
            return base.AutoSize;
        }
        set
        {
            base.AutoSize = value;
        }
    }
}

3 个答案:

答案 0 :(得分:7)

只需使用继承。但是,您必须使用自定义标签而不是系统标签。

public class MyLabel:Label
{
    public MyLabel():base()
    {
        base.AutoSize = false;
    }
}

您可以将其直接放入代码中并修改代码,如下所示。或者您可以将此类放入其自己的库中,然后您应该可以将其加载到工具箱中并像其他任何组件一样使用。

要从工具箱中工作,似乎需要覆盖InitLayout,如下所示,并向AutoSize属性添加一个属性,以便它不会被序列化到设计器中:

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [DefaultValue(false)]
    public override bool AutoSize
    {
        get
        {
            return base.AutoSize;
        }
        set
        {
            base.AutoSize = value;
        }
    }

    protected override void InitLayout()
    {
        base.InitLayout();
        base.AutoSize = false;
    }

如果您没有使用工具箱,那么将普通标签放到表单上后,您需要进入[Form].Designer.cs并找到并修改标签:

this.label1 = new MyLabel();// new System.Windows.Forms.Label();

//this.label1.AutoSize = true;

您必须删除预设的AutoSize属性,因为当您删除标签时,它会将其设置在设计器中,即使您将标签实例化更改为您的类型,手动AutoSize设置也将覆盖您的默认值

答案 1 :(得分:4)

Label控件具有以下属性:

[ToolboxItem("System.Windows.Forms.Design.AutoSizeToolboxItem,System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]

导致奇怪的AutoSize问题。

我可以通过这个禁用它:

[ToolboxItem(true)]
class MyLabel : Label
{
}

答案 2 :(得分:3)

请参阅DefaultValueAttribute

像这样:

public class MyLabel : Label
{
    [System.ComponentModel.DefaultValue(false)]
    public override bool AutoSize
    {
        get
        {
            return base.AutoSize;
        }
        set
        {
            base.AutoSize = value;
        }
    }
}

编辑:这不能按预期工作。董的答案是对的。 ......错了。