C#用户控件作为自定义面板

C#用户控件作为自定义面板,c#,winforms,user-controls,C#,Winforms,User Controls,我创建自己的用户控件,该控件仅包含一个面板: 当我在设计器中拖动myPanel对象,然后尝试在其上添加按钮时,该按钮实际上已添加到窗体的控件中 是否有我必须设置的属性/属性来执行此操作,或者以其他方式执行我想要的操作 public class MyPanel : UserControl { private Panel panelMain; public MyPanel() { InitializeComponent(); } priva

我创建自己的用户控件,该控件仅包含一个面板:

当我在设计器中拖动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);
    }
}
看看这里


但是,如果您只需要扩展面板功能,最好直接从面板继承。

更准确地说,我执行以下操作:

[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; }
    }
}
将[Designer(typeof(myControlDesigner))]与myControlDesigner一起


(其他来源:)

这正是我想要的。关于继承性,我只是简化了问题,当然我需要更复杂的东西。我使用了您的方法来创建自定义面板。但是,当我在另一个用户控件中使用此自定义面板时,当我在设计器中拖动面板上的控件时,它们最初会出现。但是,当我重新编译时,它们消失了。它们仍然在那里,但定制面板似乎在它们后面。你有这种问题吗?我使用的是VS 2005/.NET 2.0。不,我不记得有过这种问题,你有小样本吗?@bsh152s这是一个非常古老的答案,但我想补充一下“控件丢失”问题:暴露的面板/表格布局必须公开(公开修改器)。在使用这段代码时,我还添加了[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)],以确保Visual Studio序列化更改。
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");

    }

}