Come abilitare il supporto alla progettazione in un controllo personalizzato?

Proverò a spiegare cosa sto cercando. Non conosco il termine tecnico per questo, quindi ecco qui:

Esempio 1: Se metto un ListView su un modulo e aggiungo alcune colonne, sono in grado, in Design-Time, di fare clic e trascinare le colonne per ridimensionarle.

Esempio 2: Ora, metto un ListView in un UserControl e lo chiamo “MyCustomListView” (e forse aggiungo qualche metodo per migliorarlo in qualche modo).

Se so posizionare “MyCustomListView” su un modulo non riesco a fare clic e trascinare le intestazioni delle colonne per ridimensionarle in fase di progettazione.

C’è un modo per farlo facilmente? Qualche forma di “passare l’evento click-and-drag al controllo sottostante e lasciare che quel controllo faccia la sua magia” . Non sto davvero cercando di ricodificare, basta passare il mouseclick (o qualunque cosa sia) e lasciare che, in questo caso, ListView reagisca come ha fatto nel primo esempio sopra.

Il designer di Windows Form ha dedicato classi di progettazione per la maggior parte dei controlli. Il designer per ListView è System.Windows.Forms.Design.ListViewDesigner, una class interna nell’assembly System.Design.dll. Questa class ti dà la possibilità di trascinare le intestazioni delle colonne.

Un UserControl utilizza la class di progettazione System.Windows.Forms.Design.ControlDesigner. Non fa nulla di speciale, mette semplicemente un rettangolo attorno al controllo con le maniglie di trascinamento. Puoi vedere dove si sta dirigendo: dopo aver messo il controllo utente su un modulo, è ControlDesigner che viene utilizzato per progettare la class, ListViewDesigner non è nell’immagine. Quindi perdi la capacità di trascinare le intestazioni delle colonne. Si noti inoltre che ControlDesigner non consente l’accesso ai controlli all’interno dell’UC.

Ciò è tuttavia risolvibile creando il tuo designer. Inizia con Progetti + Aggiungi riferimento, seleziona System.Design. È necessario aggiungere una proprietà pubblica all’UC per esporre la vista elenco e applicare l’attributo [DesignerSerializationVisibility] per consentire il salvataggio delle proprietà modificate. E applicare l’attributo [Designer] alla class UC per sostituire il designer predefinito. Tutto dovrebbe assomigliare a questo (usando i nomi predefiniti e un ListView che visualizza “impiegati”):

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 visualizzazione elenco nel controllo utente può ora essere selezionata e progettata come normale.