Μια λύση (που τη βλέπω μάλλον σαν ημίμετρο, αλλά στο χρόνο που έχω δεν μπόρεσα να σκαρώσω τίποτα καλύτερο) είναι η παρακάτω:
Βήμα 1: Ορίζεις ένα custom designer για το user control σου, ο οποίος κληρονομεί από τον ParentControlDesigner ή τον ScrollableControlDesigner (χρειάζεσαι reference στη System.Design.dll):
[Designer(typeof(MyUserControlDesigner))]
public class MyUserControl : System.Windows.Forms.UserControl
{
}
class MyUserControlDesigner : System.Windows.Forms.Design.ParentControlDesigner
{
public MyUserControlDesigner() { }
}
Καλό είναι στον designer να πιάσεις την OnPaintAdornments για να σχεδιάζεις ένα border σε design time γύρω από το control σου.
Τώρα, ό,τι ρίχνεις πάνω στο user control θα γίνεται child του, αλλά δε θα φαίνεται γιατί είναι πιο κάτω στο z-order από το panel. Παρόλα αυτά μπορείς να το διαλέξεις από το combo box του properties window.
Βήμα 2: Πιάνεις το Load event του user control σου και κάνεις το παρακάτω:
protected override void OnLoad(EventArgs e)
{
base.OnLoad (e);
if (DesignMode)
return;
for (int index=this.Controls.Count-1; index>0; --index)
{
Control ctrl = this.Controls[index];
this.Controls.RemoveAt(index);
panel1.Controls.Add(ctrl);
}
}
Αυτός ο κώδικας κάνει (μόνο σε runtime) reparent όλα τα controls που έχεις ρίξει πάνω στο user control και τα βάζει μέσα στο panel. Βέβαια κάνει το assumption ότι το panel είναι το πρώτο control, αλλά εσύ μπορείς να τον γράψεις να είναι bullet proof.
Δεν μπορώ να πω ότι με ενθουσιάζει σα λύση, αλλά δεν έχω τίποτα καλύτερο :-(
Νατάσα Μανουσοπούλου