2010-05-07 20 views
20

Trataré de explicar lo que estoy buscando. No conozco el término técnico, así que aquí va:¿Cómo habilitar el soporte de diseño en un control personalizado?

Ejemplo 1: Si coloco un ListView en un formulario y agrego algunas columnas, puedo, en tiempo de diseño, hacer clic y arrastrar las columnas para cambiar su tamaño.

Ejemplo 2: Ahora, coloco un ListView en un control de usuario y el nombre "MyCustomListView" (y quizás añadir algún método para mejorar de alguna forma).

Si sé colocar el "MyCustomListView" en un Formulario, no puedo hacer clic y arrastrar los encabezados de columna para cambiar su tamaño en Design-Time.

¿Hay alguna manera de que esto ocurra fácilmente? Alguna forma de "pasa el evento de hacer clic y arrastrar al control subyacente y permite que ese control haga su magia". No estoy realmente buscando recodificar, simplemente pase el mouseclick (o lo que sea) y deje que, en este caso, ListView reaccione como lo hizo en el primer ejemplo anterior.

Respuesta

47

El diseñador de Windows Forms tiene clases de diseñador dedicadas para la mayoría de los controles. El diseñador de un ListView es System.Windows.Forms.Design.ListViewDesigner, una clase interna en el ensamblado System.Design.dll. Esta clase le da la capacidad de arrastrar los encabezados de columna.

Un UserControl utiliza la clase de diseñador System.Windows.Forms.Design.ControlDesigner. No hace nada especial, solo pone un rectángulo alrededor del control con los controles de arrastre. Puede ver hacia dónde se dirige esto: después de poner su control de usuario en un formulario, es ControlDesigner el que se utiliza para diseñar la clase, ListViewDesigner no está en la imagen. Perderá la capacidad de arrastrar los encabezados de columna. También tenga en cuenta que ControlDesigner no da acceso a los controles dentro de la UC.

Sin embargo, se puede arreglar creando su propio diseñador. Comience con Proyectos + Agregar referencia, seleccione System.Design. Deberá agregar una propiedad pública a la UC para exponer la vista de lista y aplicar el atributo [DesignerSerializationVisibility] para permitir que se guarden las propiedades modificadas. Y aplique el atributo [Designer] a la clase UC para reemplazar el diseñador predeterminado. Todo debe ser similar a esto (usando los nombres por defecto y un ListView que muestra "empleados"):

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; // Note: add reference required: System.Design.dll 

namespace WindowsFormsApplication1 { 
    [Designer(typeof(MyDesigner))] // Note: custom designer 
    public partial class UserControl1 : UserControl { 
     public UserControl1() { 
      InitializeComponent(); 
     } 

     // Note: property added 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public ListView Employees { get { return listView1; } } 
    } 

    // Note: custom designer class added 
    class MyDesigner : ControlDesigner { 
     public override void Initialize(IComponent comp) { 
      base.Initialize(comp); 
      var uc = (UserControl1)comp; 
      EnableDesignMode(uc.Employees, "Employees"); 
     } 
    } 
} 

La vista de lista en el control de usuario ahora se puede hacer clic y diseñado de forma normal.

+6

++ gracias por ser amable. Me alegro de que se presentó y me enseñó algo. –

+4

Ese fue el ejemplo perfecto de una respuesta perfecta =) ¡Gracias! – Ted

Cuestiones relacionadas