2010-07-27 5 views
6

¿Cómo le dice al diseñador el valor predeterminado de una propiedad cuando no es uno de los tipos admitidos por DefaultValue()? Por ejemplo, un Padding, o un Font.¿Cómo puede saber el diseñador de C# la propiedad predeterminada para un relleno u otro objeto/estructura en C#

Normalmente, cuando utiliza un control de Windows Forms, los valores predeterminados estarán en una fuente normal en la ventana Propiedades, y los valores modificados (no predeterminados) estarán en negrita. P.ej.

Image of properties windows with non-default values in bold

En esta muestra, el valor por defecto de ShowAddress es false y el valor por defecto de ShowName es true. Este efecto se consigue con el siguiente:

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

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

Sin embargo, cuando traté de hacer algo por Padding, fracasé miserablemente:

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

Lo que por supuesto no se compilará.

¿Cómo demonios haría esto?

Respuesta

8

Prueba esto:

navegador
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; } 

La propiedad se ve en la función llamada ShouldSerializeXYZ para cada propiedad XYZ. Siempre que ShouldSerializeXYZ devuelve falso, no escribe nada durante la generación del código.

EDIT: documentación:

+0

no parece trabajar para yo. Utilizando Visual C# 2008. Luego de ingresar el código, escribió la propiedad al diseñador del formulario, luego de volver a establecerlo de manera predeterminada, y nunca quitó la negrita en la Ventana de Propiedades. –

+0

Tampoco funciona en Visual C# 2010 –

+0

Lo siento, tuve el nombre equivocado. También agregué un enlace a la documentación. –

18

Prueba esto:

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