2009-08-31 61 views
7

创建我自己的用户控件只包含一个面板:C#用户控件作为自定义面板

当我在设计拖动myPanel对象,然后尝试添加按钮就可以了,按钮其实是在添加到窗体的控件。

是否有一个属性/属性,我必须设置为了执行此操作,另一种方法来做我想要的?

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); 
    } 
} 

回答

2

为了更精确,我执行以下操作:

[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; } 
    } 
} 

随着myControlDesigner为[设计师(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"); 

    } 

} 

(其它来源:Add Control to UserControl

+0

我已经使用您的方法来创建自定义面板。但是,当我在另一个用户控件中使用此自定义面板时,当我在设计器的面板上拖动控件时,它们最初出现。但是,当我重新编译时,它们消失了。他们仍然在那里,但似乎自定义面板是在他们之后/之后绘制的。你有这种问题吗?我正在使用VS 2005/.NET 2.0。 – bsh152s 2009-09-23 17:33:19

+0

不,我不记得有这样的问题,你有小样本吗? – Toto 2009-10-05 12:18:43

+3

@ bsh152s这是一个非常古老的答案,但我想要谈谈'控制失败'问题:所公开的Panel/TableLayout必须公开公开(public修饰符)。在使用此代码时,我还添加了[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]以确保Visual Studio序列化更改。 – 2013-05-07 23:10:17