我创建了一个用户控件,现在我希望能够设置它,这样我就可以为每个实例添加子项。
这就是它的布局:
红色框是我希望能够添加儿童的面板。我的想法是在winforms应用程序中使用此控件,然后将新控件拖放到红色父容器中。
我该怎么做?
答案 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;
}
}
如果要公开多个主机,可以修改NumberOfInternalControlDesigners
和InternalControlDesigner
方法。但是,它从来没有真正对我有用。您可以通过要添加的组件来决定应该使用哪个父项(请参阅GetParentForComponent
),但这意味着按钮始终会添加到按钮面板中。我建议仅将内容面板作为父级提供,并使用一些公共属性来操作按钮面板。