使用TableLayoutPanel将用户控件作为容器

时间:2014-09-02 12:29:09

标签: c# winforms windows-forms-designer

我有一个用户控件,可以充当其他控件的容器。我的容器非常简单,因为它只包含一个样式面板,其中包含一个TableLayoutPanel来保存多个子控件:

MyContainerControl -> Panel -> TableLayoutPanel

现在我想启用设计器支持来嵌套控件。快速搜索显示这是可能的:

但是我的控件与示例中的控件略有不同。示例控件将子控件添加到面板,而我的控件将子控件添加到 TableLayoutPanel (这实际上是Panel的子类)。

我认为这不应该是一个很大的问题,并开始实施:

[Designer(typeof(ControlListPanel.Designer))]
public partial class ControlListPanel : UserControl
{
    [Browsable(false)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public TableLayoutPanel LayoutArea
    {
        get { return this.rootTableLayoutPanel; }
    }

    // ... more class content ...

    public class Designer : ParentControlDesigner
    {
        public override void Initialize(System.ComponentModel.IComponent component)
        {
            base.Initialize(component);

            if (this.Control is ControlListPanel)
            {
                this.EnableDesignMode(((ControlListPanel)this.Control).LayoutArea, "LayoutArea");
            }
        }
    }
}

现在我可以将控件拖放到我的用户控件上,但查看设计器文件会显示控件已添加到用户控件本身:

this.controlListPanel1.Controls.Add(this.myChildControl);

我希望将它添加到表格布局中:

this.controlListPanel1.LayoutArea.Controls.Add(this.myChildControl);

当我按如下方式更改LayoutArea属性时,设计师会按照我的预期执行操作,并将子控件添加到LayoutArea属性中:

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Panel LayoutArea
{
    get { return this.panel; }
}

(我返回面板而不是表格布局)

我有什么遗失的吗?为什么设计师不想将我的子控件添加到TableLayoutPanel

0 个答案:

没有答案