2013-05-24 18 views
16

Voglio creare un controllo in winform con lo stesso comportamento dei controlli del contenitore. Voglio dire: in modalità progettazione, quando rilasciamo i controlli al suo interno, questo verrà raggruppato, proprio come una casella di gruppo.Crea contenitore winforms personalizzato

Questo controllo che sto creando contiene altri controlli E un GroupBox. Tutto ciò di cui ho bisogno è: quando un controllo viene rilasciato in modalità progettazione sul controllo personalizzato, lo inserisco semplicemente nel GroupBox nidificato.

Ma non riesco a capire come rendere il mio controllo rispondere a quel tipo di azione in modalità progettazione.

risposta

10

Forse this è quello che ti serve, ho trovato in CodeProject un tempo fa:

Progettare controlli nidificati:

questo articolo viene illustrato come consentire un controllo, che è un figlio di un altro Controllo per accettare di avere i controlli caduti su di esso al momento del progetto . Non è un articolo di grandi dimensioni, non c'è molto in termini di codice e potrebbe non essere il modo "ufficiale" o il modo migliore per farlo. Lo fa, tuttavia, funziona, ed è stabile per quanto ho potuto testarlo.

+0

È molto carino! Molte grazie! Cercando di scoprire come evitare questo inconveniente menzionato senza avere il GroupBox permanentemente bloccato. –

+2

Utilizzando la soluzione di cui sopra e ignorando i due metodi 'CanParent' da' ParentControlDesigner' per sempre 'return false', posso bloccare l'utente cercando di aggiungere controlli all'esterno di' WorkingArea'. Ciò blocca anche l'utente che tenta di spostare 'WorkingArea'. Ora ho bisogno di bloccare il ridimensionamento di quell'area. Con quello, credo che la risposta sia sufficiente, non perfetta però. –

6

è necessario aggiungere un Designer attribute al vostro controllo, e utilizzare un tipo che deriva da o è la ParentControlDesigner Class (ha bisogno di un riferimento all'assembly System.Design.dll), in questo modo:

[Designer(typeof(MyCustomControlDesigner1))] 
public partial class CustomControl1 : Control 
{ 
    public CustomControl1() 
    { 
     MyBox = new GroupBox(); 
     InitializeComponent(); 
     MyBox.Text = "hello world"; 
     Controls.Add(MyBox); 
    } 

    public GroupBox MyBox { get; private set; } 
} 

public class MyCustomControlDesigner1 : ParentControlDesigner 
{ 
    // When a control is parented, tell the parent is the GroupBox, not the control itself 
    protected override Control GetParentForComponent(IComponent component) 
    { 
     CustomControl1 cc = (CustomControl1)Control; 
     return cc.MyBox; 
    } 
} 
+0

Questo è vero, ma ciò non risolve il modo in cui gli elementi verranno eliminati nella casella di gruppo nidificata – YK1

+0

Questo è un ottimo inizio. Se la mia casella riempie l'intero controllo, tutto quello che dovrei fare ora è capire come aggiungere dei bordi come quelli del GroupBox. (+1) –

+0

Ma se la casella è solo una parte del controllo, è necessaria ulteriore conoscenza. –

Problemi correlati