2009-08-31 17 views
7

ich meine eigene Benutzersteuerung erstellen, die nur eine Platte enthält:C# Benutzersteuerung als benutzerdefinierte Panel

Wenn ich ein MyPanel Objekt im Designer ziehen und dann versuchen, einen Knopf auf, um es hinzuzufügen, ist die Taste in der Tat den Steuerelementen des Formulars hinzugefügt.

Gibt es eine Eigenschaft/ein Attribut, die ich einstellen muss, um dies zu tun, eine andere Art zu tun, was ich will?

public class MyPanel : UserControl 
{ 
    private Panel panelMain; 

    public MyPanel() 
    { 
     InitializeComponent(); 
    } 

    private void InitializeComponent() 
    { 
     this.panelMain = new System.Windows.Forms.Panel(); 
     this.SuspendLayout(); 
     // 
     // panelMain 
     // 
     this.panelMain.BackColor = System.Drawing.SystemColors.ActiveCaption; 
     this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.panelMain.Location = new System.Drawing.Point(0, 0); 
     this.panelMain.Name = "panelMain"; 
     this.panelMain.Size = new System.Drawing.Size(150, 150); 
     this.panelMain.TabIndex = 0; 
     // 
     // myPanel 
     // 
     this.Controls.Add(this.panelMain); 
     this.Name = "MyPanel"; 
     this.ResumeLayout(false); 
    } 
} 

Antwort

2

genauer zu sein, kann ich folgendes:

[Designer(typeof(myControlDesigner))] 
public class MyPanel : UserControl 
{ 
    private TableLayoutPanel tableLayoutPanel1; 
    private Panel panelMain; 
    ... 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public Panel InnerPanel 
    { 
     get { return panelMain; } 
     set { panelMain = value; } 
    } 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public TableLayoutPanel InnerTableLayout 
    { 
     get { return tableLayoutPanel1; } 
     set { tableLayoutPanel1 = value; } 
    } 
} 

Mit myControlDesigner für [Designer (typeof (myControlDesigner))]

class myControlDesigner : ParentControlDesigner 
{ 

    public override void Initialize(IComponent component) 
    { 

     base.Initialize(component); 

     MyPanel myPanel = component as MyPanel; 
     this.EnableDesignMode(myPanel.InnerPanel, "InnerPanel"); 
     this.EnableDesignMode(myPanel.InnerTableLayout, "InnerTableLayout"); 

    } 

} 

(Weitere Quelle: Add Control to UserControl) sein

+0

Ich habe Ihren Ansatz zum Erstellen eines benutzerdefinierten Bereichs verwendet. Wenn ich dieses benutzerdefinierte Bedienfeld in einem anderen Benutzersteuerelement verwende, erscheinen die Steuerelemente jedoch zunächst auf dem Bedienfeld des Designers. Aber wenn ich neu kompiliere, verschwinden sie. Sie sind immer noch da, aber es scheint, dass das Custom Panel über/nach ihnen gezogen wird. Hattest du dieses Problem? Ich benutze VS 2005/.NET 2.0. – bsh152s

+0

Nein, ich kann mich nicht erinnern, solche Probleme zu haben, hast du eine kleine Probe? – Toto

+3

@ bsh152s Dies ist eine sehr alte Antwort, aber ich wollte über das Problem 'Controls is lost' plaudern: Das exponierte Panel/TableLayout muss öffentlich zugänglich sein (public modifier). Bei der Verwendung dieses Codes habe ich auch [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)] hinzugefügt, um sicherzustellen, dass Visual Studio die Änderungen serialisiert. –

Verwandte Themen