2009-07-08 12 views
6

Estoy creando un control de etiqueta personalizado (simplemente heredando el control de etiqueta estándar y volviendo a pintar el fondo y el texto) porque necesito un fondo y un borde muy específicos. En el constructor del control, establezco la propiedad AutoSize en falso para que pueda tener un tamaño predeterminado estándar para la nueva etiqueta.El control de etiqueta se comporta de manera diferente en tiempo de diseño vs. tiempo de ejecución

Public Sub New() 

    'Set the default size of the control to 75x24 
    Me.Height = 24 
    Me.Width = 75 

    'Turn off the autosize property. 
    Me.AutoSize = False 

    'Turn on double-buffering. 
    Me.DoubleBuffered = True 

End Sub 

En mi aplicación que utiliza este control, si creo la nueva etiqueta personalizada en tiempo de ejecución (en código), se mantiene la propiedad AutoSize Falso, y funciona correctamente.

Si trato de agregar la nueva etiqueta personalizada a mi formulario en el momento del diseño, viene con la propiedad AutoSize establecida en True y tengo que configurarla manualmente en False en la ventana de propiedades. No es un gran problema, pero no entiendo por qué el comportamiento es diferente.

¿Alguna idea de qué está causando esta diferencia en el comportamiento?

+0

Como nota al margen, en su constructor, establecería el AutoSize en falso antes de establecer el alto y el ancho. – NascarEd

+0

@NascarEd, gracias por la nota. Lo he intentado de ambas formas y no parece marcar la diferencia. – Stewbob

+0

Como otra nota al margen: después de crear un control personalizado, siempre es una buena idea colocarlo en un formulario y examinar el código que genera el diseñador. El diseñador generalmente hace cosas que no esperarías. – NascarEd

Respuesta

3

Finalmente conseguí que esto funcione en VB. Tuve que deshabilitar la declaración de Set, convirtiendo esencialmente la Propiedad de AutoSize Reemplazada en una propiedad de solo lectura.

 Public Overrides Property AutoSize() As Boolean 
     Get 
      Return MyBase.AutoSize 
     End Get 
     Set(ByVal value As Boolean) 
      'Do nothing here 
     End Set 
    End Property 

Gracias a NascarEd por hacerme apuntar en la dirección correcta.

6

En su clase de etiqueta, debe anular la propiedad Tamaño automático.

//(In C#) 
[System.ComponentModel.Browsable(false)] 
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] 
public new bool AutoSize 
{ 
    get { return base.AutoSize; } 
    set { base.AutoSize = value; } 
} 

La navegable (falso), se oculta la propiedad en tiempo de diseño y el atributo DesignerSerializationVisibility le dirá que el diseñador no escribir ningún código en el archivo de diseño.

+0

Lo he implementado, pero aunque el diseñador ya no establece explícitamente la propiedad AutoSize en verdadero, como lo hacía antes, todavía establece explícitamente la propiedad .Size como si AutoSize estuviera todavía activado. Tal vez también intente anular la propiedad Size en mi control. – Stewbob

+0

Aunque esto no parece funcionar en VB, agradezco su ayuda. Me ha dado una mejor idea de cómo crear controles personalizados. ¡Gracias! – Stewbob

0

Si entra en el modo de diseño para el nuevo control que está creando, debería poder seleccionar ese control y cambiar las propiedades como lo desee. A partir de ese momento, cada vez que agregue ese control al formulario (u otro control) tendrá las propiedades que establece allí como predeterminado. Esto debería permitirle establecer los valores predeterminados al mismo tiempo que los mantiene visibles para que los desarrolladores puedan cambiar las cosas en caso de que no quieran que se puedan redimensionar en el futuro.

O bien, revise el código generado por el diseñador, ya que le mostrará exactamente lo que hizo para generar el comportamiento que está buscando.

2

Sólo para su futura información, para establecer la propiedad AutoSize en False en la ventana de propiedades, es necesario establecer un atributo: -

< System.ComponentModel.DefaultValue (Falso) > _

Public Overrides Property AutoSize() Como booleano ....

+0

Gracias, buena información. – Stewbob

Cuestiones relacionadas