如何让C#设计器知道C#中的Padding或其他对象/结构的默认属性

Vin*_*abb 8 c# attributes default-value visual-studio-2008 winforms

当一个属性不是支持的类型之一时,如何告诉设计者默认值DefaultValue()?例如,a Padding或a Font.

通常,当您使用Windows窗体控件时,默认值将在"属性"窗口中以普通字体显示,并且更改(非默认)值将以粗体显示.例如

属性窗口的图像,其中非默认值以粗体显示

在此示例中,默认值为ShowAddressis false,默认值为ShowNameis true.通过以下方式实现此效果:

[DefaultValue(false)]
public bool ShowAddress {
  get { return mShowAddress; }
  set { 
    mShowAddress = value; 
    Invalidate();
  }
}

[DefaultValue(true)]
public bool ShowName { ... }
Run Code Online (Sandbox Code Playgroud)

然而,当我试图做某事时Padding,我悲惨地失败了:

[DefaultValue(new Padding(2))]
public Padding LabelPadding { ... }
Run Code Online (Sandbox Code Playgroud)

哪个当然不会编译.

我怎么会这样做?

Ade*_*zah 20

试试这个:

[DefaultValue( typeof( Padding ), "2, 2, 2, 2" )]
public Padding LabelPadding
{
    get { return _labelPadding; }
    set { _labelPadding = value; }
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*igt 9

试试这个:

private static Padding DefaultLabelPadding = new Padding(2);
private internalLabelPadding = DefaultLabelPadding;
public Padding LabelPadding { get { return internalLabelPadding; } set { internalLabelPadding = value; LayoutNow(); } }

// next comes the magic
bool ShouldSerializeLabelPadding() { return LabelPadding != DefaultLabelPadding; }
Run Code Online (Sandbox Code Playgroud)

属性浏览器查找ShouldSerializeXYZ为每个属性命名的函数XYZ.每当ShouldSerializeXYZ返回false时,它在代码生成期间不会写任何内容.

编辑:文档: