2010-10-01 22 views
5

El siguiente código es un control personalizado. Usar este control en el diseñador de Visual Studio hace que Visual Studio pase a CRASH sin ningún detalle notable.Causa del control personalizado Visual Studio 2008 a CRASH

Estoy usando Visual Studio 2008.

Estoy haciendo algo mal aquí?

using System; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 

namespace InstalacionesSayma.GUI 
{ 
    public class CustomControlTest : Panel 
    { 
     private Label _label; 

     public CustomControlTest() 
     { 
      _label = new Label(); 
      this.Controls.Add(_label); 
     } 

     public override Font Font 
     { 
      get 
      { 
       return _label.Font; 
      } 
      set 
      { 
       _label.Font = value; 
      } 
     } 
    } 
} 
+0

no estoy seguro pero me gustaría quitar 'this.Controls.Add (_label);' desde el constructor y lo puso en otro lugar - si usted tiene a * .Design.cs, hacer la puesta a punto puede haber .. . – FrustratedWithFormsDesigner

Respuesta

2

VS2005 tenía una habilidad especial para colgarse en el escritorio cuando se producía una excepción durante el tiempo de diseño. Eso no puede ser causado por el código que publicaste. Dudo que estemos mirando el código real, este control no hace nada.

tener cuidado con los manejadores de eventos y constructor, que estará manejando un tiempo de diseño también. Si hace algo que dependa críticamente del estado del programa, como intentar abrir archivos o hablar con un servidor dbase, etcétera, evite ejecutar dicho código marcando la propiedad this.DesignMode.

5

El bloqueo ocurre debido a lo que tiene en el comportamiento de la fuente. Está anulando el comportamiento esperado de la propiedad Fuente de un panel. Cómo cambiar el código fuente para que a continuación hace que el accidente se vaya:

public override Font Font 
    { 
    get 
    { 
     return base.Font; 
    } 
    set 
    { 
     base.Font = value; 
     _label.Font = value; 
    } 
    } 
2

Creo que el problema es su propiedad Font a la luz de la naturaleza de la forma en que el diseñador trabaja con respecto a los paneles y su contenido. Por defecto, la Fuente de la etiqueta hereda de la Fuente de su contenedor (Puede probar esto agregando un panel a un control y luego agregar una etiqueta a ese panel. Luego cambie la Fuente del Panel, y viola, su etiqueta - - a menos que le hayas dado explícitamente una fuente no predeterminada - se actualizará con la nueva fuente del contenedor).

Por lo tanto, tal como está, cuando se añade el control a la forma, la fuente de la etiqueta se actualiza para que coincida con la fuente del contenedor, y y se inicia bucle sin fin.

Parece que esto se puede solucionar por darle a su etiqueta de una fuente explícita cuando se crea. Algo como esto parece solucionar el problema:

public CustomControlTest() 
    { 
     _label = new Label(); 
     _label.Font = new Font("Ariel", 8.5f); 
     this.Controls.Add(_label); 
    } 

ETA: En respuesta a Hans, yo era capaz de reproducir el accidente usando el código provisto y VS2008, y yo era capaz de evitar el choque por la inicialización de la Font .

ETA2: En mi anterior ETA, me di cuenta de que mi respuesta puede haber sonado más dura de lo que pretendía. Tal vez debería haber elaborado para mencionar que no vi el bloqueo hasta que intenté agregar el control a un formulario. Hans tiene razón en que, en sí mismo, ese código no debería causar la falla de Visual Studio ... es cuando el diseñador interviene para tratar de inicializar y dibujar el control que se encuentra con problemas. En esa nota, ¿cómo se pueden agregar comentarios directamente a la publicación de otra persona? ¿Se necesita una cierta reputación mínima?

Cuestiones relacionadas