2012-03-16 16 views
5

De acuerdo con MSDN (http://msdn.microsoft.com/en-us/library/system.windows.forms.label.autosize.aspx), hay una nota sobre Label 's AutoSize propiedad:¿Cómo establecer valores predeterminados de propiedades en tiempo de diseño?

cuando se añade a un formulario utilizando el diseñador, el valor predeterminado es true. Cuando se crea una instancia del código, el valor predeterminado es falso.

La pregunta es: ¿cómo puedo anular un control Label y establecer en tiempo de diseño valor por defecto de su AutoSize de propiedad a false?

(Actualización)

Y esto no funciona:

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

Respuesta

4

El control Label tiene un atributo:

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

que causan la extraña AutoSize problema.

puedo desactivar el presente:

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

No puedo probar esto en mi extremo en este momento, pero tomaré su palabra, que resuelve su problema. :) ¡Me gusta! – rfmodulator

2

Véase el DefaultValueAttribute

así:

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

EDIT: esto no funciona como se esperaba. La respuesta de Tung es correcta. ... equivocado de nuevo.

+0

No, esto no funciona. Inténtalo tú mismo. – EFanZh

+0

@EFanZh Claro que sí ... ¿Qué problema te encuentras? – rfmodulator

+0

Si arrastra el control desde la caja de herramientas, Windows Form Designer generará automáticamente el código 'AutoSize = true'. – EFanZh

6

Simplemente use herencia. Sin embargo, tendrá que usar su etiqueta personalizada en lugar del sistema.

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

Puede poner esto directamente en su código y modificar el código como a continuación. O puede colocar esta clase en su propia biblioteca, que luego debería poder cargar en la caja de herramientas y usar como cualquier otro componente.

Para que esto funcione de la caja de herramientas, parece que se debe redefinir el InitLayout, como el de abajo, y añadir un atributo a la propiedad AutoSize por lo que no es de serie en el diseñador:

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

Si no está utilizando la caja de herramientas, a continuación, una vez que se le cae la etiqueta de lo normal en su forma, es necesario entrar en el [Form].Designer.cs y encontrar y modificar sus etiquetas:

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

//this.label1.AutoSize = true; 

usted tiene que quitar la propiedad AutoSize preestablecido porque cuando se soltar la etiqueta que establece es todo en el diseñador, e incluso si cambia la creación de instancias de etiqueta para que sea su tipo, el conjunto AutoSize manual de anulará su defecto

+0

Esto tampoco funciona. Inténtalo tú mismo. – EFanZh

+0

Acabo de hacer. Actualizaré mi código para mostrar cómo se debe implementar esto. –

+0

Ummm, es un error tipográfico en tu comentario, porque el valor predeterminado normal es verdadero. Entonces, el valor por defecto es lo que usted solicitó ... –

Cuestiones relacionadas