将子项添加到UserControl

时间:2017-07-07 11:40:13

标签: c# winforms

我创建了一个用户控件,现在我希望能够设置它,这样我就可以为每个实例添加子项。

这就是它的布局:

enter image description here

红色框是我希望能够添加儿童的面板。我的想法是在winforms应用程序中使用此控件,然后将新控件拖放到红色父容器中。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

  

我只想知道是否可以将项目从工具箱拖到其中一个红色区域,使其成为用户控件的子项。

是的,有可能:

[Designer(typeof(MyUserControlDesigner))]
public partial class MyUserControl : UserControl
{
}

你必须实现一个设计师类。这是您在设计时向内部Content面板添加控件的方法(假设面板公开为公共PanelContent属性):

internal sealed class MyUserControlDesigner : ParentControlDesigner
{
    IDesignerHost designerHost;

    public override void Initialize(IComponent component)
    {
        base.Initialize(component);
        base.AutoResizeHandles = true;
        base.EnableDesignMode(((MyUserControl)component).PanelContent, "ContentPanel");
        designerHost = (IDesignerHost)component.Site.GetService(typeof(IDesignerHost));
    }

    public override bool CanParent(Control control)
    {
        return false;
    }

    public override System.Collections.ICollection AssociatedComponents
    {
        get
        {
            List<Control> list = new List<Control>();
            foreach (Control control in ((MyUserControl)Control).PanelContent.Controls)
            {
                list.Add(control);
            }
            return list;
        }
    }

    protected override Control GetParentForComponent(IComponent component)
    {
        return ((MyUserControl)Control).PanelContent;
    }

    public override int NumberOfInternalControlDesigners()
    {
        return 1;
    }

    public override ControlDesigner InternalControlDesigner(int internalControlIndex)
    {
        Control panel = ((MyUserControl)Control).PanelContent;
        switch (internalControlIndex)
        {
            case 0:
                return this.designerHost.GetDesigner(panel) as ControlDesigner;
            default:
                return null;
        }
    }

    protected override IComponent[] CreateToolCore(ToolboxItem tool, int x, int y, int width, int height, bool hasLocation, bool hasSize)
    {
        ParentControlDesigner panelDesigner = this.designerHost.GetDesigner(((MyUserControl)Control).PanelContent) as ParentControlDesigner;
        InvokeCreateTool(panelDesigner, tool);
        return null;
    }
}

如果要公开多个主机,可以修改NumberOfInternalControlDesignersInternalControlDesigner方法。但是,它从来没有真正对我有用。您可以通过要添加的组件来决定应该使用哪个父项(请参阅GetParentForComponent),但这意味着按钮始终会添加到按钮面板中。我建议仅将内容面板作为父级提供,并使用一些公共属性来操作按钮面板。