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

9
当一个属性的默认值不属于DefaultValue()支持的类型时,如何告诉设计者它的默认值呢?例如,PaddingFont。通常,当您使用Windows Forms控件时,在属性窗口中,默认值将以普通字体显示,而更改(非默认)的值将以粗体显示。例如: 在此示例中,ShowAddress的默认值为falseShowName的默认值为true。这种效果可以通过以下方法实现:
[DefaultValue(false)]
public bool ShowAddress {
  get { return mShowAddress; }
  set { 
    mShowAddress = value; 
    Invalidate();
  }
}

[DefaultValue(true)]
public bool ShowName { ... }

然而,当我尝试对Padding进行操作时,我彻底失败了:

[DefaultValue(new Padding(2))]
public Padding LabelPadding { ... }

当然,这样是无法编译通过的。
我该如何做呢?
2个回答

22

试试这个:

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

10

试试这个:

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; }
属性浏览器会为每个属性XYZ查找名为ShouldSerializeXYZ的函数。每当ShouldSerializeXYZ返回false时,在代码生成期间不写入任何内容。
编辑:文档:

对我来说似乎不起作用。使用的是Visual C# 2008。在输入代码后,它将属性写入了表单设计器,然后将其设置回默认值,但属性窗口中的加粗效果却没有消失。 - Vincent McNabb
抱歉,我的命名有误。我还添加了一条链接到文档。 - Ben Voigt

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