2009-06-25 18 views
9

Estoy haciendo algunos controles que tienen que compartir el mismo aspecto y comportamiento común, aunque están diseñados para diferentes tipos de entradas. Así que hice una BaseClass que hereda de UserControl, y todos mis controles heredan de BaseClass.Cómo acceder a controles heredados en el diseñador de winforms

Sin embargo, si agrego controles para BaseClass en el diseñador, como TableLayoutPanel, no puedo acceder a ellos cuando estoy diseñando las clases heredadas. Veo TableLayoutPanel, pero a pesar de que está "protegido", no puedo modificarlo ni ponerle controles a través del diseñador. No tengo problemas para acceder por código, pero no quiero perder la capacidad de usar el diseñador.

En este momento, simplemente eliminé todos los controles de BaseClass, agregué el diseño y todos los controles comunes en cada una de las clases heredadas, luego utilicé referencias para manipularlos dentro de BaseClass. Pero eso no me satisface en absoluto. ¿Hay alguna manera de que el diseñador trabaje con controles heredados de miembros protegidos?

Medio Ambiente: C#, .NET 3.5, Visual Studio 2008

EDITAR para responder a la sugerencia de SLaks. Intenté configurar una propiedad, y aunque no estoy acostumbrado a usarla, parece que no funciona. Aquí está el código que probé:

public partial class UserControl1 : UserControl 
    { 
      public UserControl1() 
      { 
        InitializeComponent(); 
      } 

      public TableLayoutPanel TableLayoutPanel1 
      { 
        get { return tableLayoutPanel1;} 
        set { tableLayoutPanel1 = value;} 
      } 
    } 

    public partial class UserControl2 : UserControl1 
    { 
      public UserControl2() 
      { 
        InitializeComponent(); 
      } 
    } 
+0

¿Sería capaz de heredar de TableLayoutPanel? – SLaks

+0

Claro, siempre puedes crear tu propio control heredado del control de winforms. Hice esto para implementar algunos controles. Pero eso no es lo que estoy tratando de lograr aquí. Intento tener un control con varios controles básicos: un panel de salida de tabla, con algunos controles (como una etiqueta) y varios espacios vacíos que las clases heredadas deben rellenar con los controles que elijan. El objetivo final es agregar todos los controles de tesis a la caja de herramientas y luego drap y colocarlos en el diseñador para crear formularios que tienen muchos controles pero comportamiento/diseño común a través de estos controles. – Ksempac

+0

Y, por cierto, heredar de un control Winform cortará al diseñador, ya que, por lo general, el objetivo es solo implementar un comportamiento específico, sin rediseñar el control usted mismo. – Ksempac

Respuesta

11

Cuando intenta acceder desde el control heredado con el diseñador al TableLayoutPanel declarado en el control base, está usando una característica en WinForms llamada "Herencia visual".

Desafortunadamente TableLayoutPanel no soporta la herencia visual: http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

Por eso TableLayoutPanel aparece bloqueada en los controles heredados.

+0

Me encontré directamente con este problema. FTA: "Use el control TableLayoutPanel con moderación". –

+0

Sí, esto parece un callejón sin salida. Pude encontrar la mayor parte de la fuente de C# para tablelayout y el diseñador, pero parece que nunca encontraré los archivos FlowPanelDesigner.uex asociados con este control. – garaber

0

Tiene que diseñar los controles base por su cuenta. Los cambios se reflejan en el diseñador después de reconstruir con éxito el proyecto de controles. Si haces que los miembros sean públicos, puedes editarlos, pero los cambios no se mantendrán.

+0

Establecer las filas, columnas y tamaño de un TableLayoutPanel en la clase base es lo que me gustaría hacer.Pero no tiene sentido si no puedo agregar controles en el diseño cuando estoy diseñando la clase derivada. Por ejemplo, tener una celda en blanco en mi mesa de trabajo, y luego agregar, a través del diseñador, un control diferente en cada una de las clases derivadas en esta celda. – Ksempac

+0

No puede modificar el control base mientras diseña el control derivado. No es fácil de todos modos. Si hiciste públicos los "espacios vacíos" (por ejemplo, EmptyPanel1, EmptyPanel2, ...) y luego proporcionaste tu propio TypeEditor para ellos, al menos puedes permitirles establecer los controles visualmente. Sin embargo, crear un editor de tipos es un poco trabajoso. –

1

Trate de añadir este atributo a la definición del panel (esto puede o no puede ayudar):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
+0

No, no funciona. – Ksempac

+0

Intente hacer que el campo sea privado y agregue ese atributo a una propiedad pública exponiéndolo. – SLaks

+0

Eso es lo que hace SplitContainer – SLaks

0

Trate de hacer una ParentControlDesigner para su control, anulando InternalControlDesigner, y volviendo (designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner). designerHost es (IDesignerHost) component.Site.GetService(typeof(IDesignerHost)).

0

Recuerdo vagamente resolver un problema similar al poner la clase base en su propia DLL y compilarla primero. He tenido un rummage pero no puedo encontrar el proyecto. Lo siento.

Cuestiones relacionadas