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

8

我创建了一个只包含面板的用户控件:

当我在设计器中拖动一个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个回答

8

这正是我所寻找的。关于继承,我只是让问题变得更简单了,当然我需要更复杂的东西。 - Toto

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可以为[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");

    }

}

(Other source : Add Control to UserControl )


我已经采用了您的方法创建自定义面板。但是,当我在另一个用户控件中使用此自定义面板时,在设计器中拖动面板上的控件时,它们一开始会出现。但是,当我重新编译后,它们就消失了。它们仍然存在,但似乎自定义面板覆盖/绘制了它们。您是否遇到过这种问题?我正在使用VS 2005/.NET 2.0。 - bsh152s
不,我不记得有这种问题,你有一个小样例吗? - Toto
3
这是一个很旧的回答,但我想就“控件丢失”的问题发表意见:必须公开暴露 Panel/TableLayout(public 修饰符)。在我的代码中,我还添加了 [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 来确保 Visual Studio 序列化更改。 - Derek Gates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接