C# 将控件拖放到自定义用户控件上会变得隐藏

C# 将控件拖放到自定义用户控件上会变得隐藏,c#,winforms,user-controls,drag-and-drop,design-time,C#,Winforms,User Controls,Drag And Drop,Design Time,我创建了一个自定义UserControl,在这里我支持在设计时拖放控件。我的控件被正确地放入我的用户控件中,但是一旦放入用户控件,它们就会被隐藏。要使添加的控件变得可见,我必须选择它,然后单击设计时IDE按钮“转到前面”,以查看添加的控件。重建解决方案时,控件再次隐藏 我用下面的代码复制了这个问题。在IDE中,我创建了一个简单的用户控件“MyControl”,并在其中添加了一个停靠到“Fill”的面板控件。然后应将此用户控件“MyControl”放到Windows面板上。然后,将另一个控件(如L

我创建了一个自定义UserControl,在这里我支持在设计时拖放控件。我的控件被正确地放入我的用户控件中,但是一旦放入用户控件,它们就会被隐藏。要使添加的控件变得可见,我必须选择它,然后单击设计时IDE按钮“转到前面”,以查看添加的控件。重建解决方案时,控件再次隐藏

我用下面的代码复制了这个问题。在IDE中,我创建了一个简单的用户控件“MyControl”,并在其中添加了一个停靠到“Fill”的面板控件。然后应将此用户控件“MyControl”放到Windows面板上。然后,将另一个控件(如Label或Buton控件)拖放到用户控件上,该控件将隐藏

下面是用户控件的代码。如何使在设计时放入用户控件的控件自动放在前面

MyControl.Designer.cs:

namespace Test
{
    partial class MyControl
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            // 
            // panel1
            // 
            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panel1.Location = new System.Drawing.Point(0, 0);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(150, 150);
            this.panel1.TabIndex = 0;
            // 
            // MyControl
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.panel1);
            this.Name = "MyControl";
            this.ResumeLayout(false);

        }

        private System.Windows.Forms.Panel panel1;
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace Axiom.Controls
{
    [Designer(typeof(ParentControlDesigner))]
    public partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public Panel ContentPanel
        {
            get
            {
                return this.panel1;
            }
        }
    }

    internal class MyControlDesigner : ControlDesigner
    {
        public override void Initialize(IComponent component)
        {

            base.Initialize(component);

            MyControl control = component as MyControl;

            EnableDesignMode(control.ContentPanel, "ContentPanel");
        }
    }
}
MyControl.cs:

namespace Test
{
    partial class MyControl
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            // 
            // panel1
            // 
            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panel1.Location = new System.Drawing.Point(0, 0);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(150, 150);
            this.panel1.TabIndex = 0;
            // 
            // MyControl
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.panel1);
            this.Name = "MyControl";
            this.ResumeLayout(false);

        }

        private System.Windows.Forms.Panel panel1;
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace Axiom.Controls
{
    [Designer(typeof(ParentControlDesigner))]
    public partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public Panel ContentPanel
        {
            get
            {
                return this.panel1;
            }
        }
    }

    internal class MyControlDesigner : ControlDesigner
    {
        public override void Initialize(IComponent component)
        {

            base.Initialize(component);

            MyControl control = component as MyControl;

            EnableDesignMode(control.ContentPanel, "ContentPanel");
        }
    }
}

更新:

namespace Test
{
    partial class MyControl
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            // 
            // panel1
            // 
            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panel1.Location = new System.Drawing.Point(0, 0);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(150, 150);
            this.panel1.TabIndex = 0;
            // 
            // MyControl
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.panel1);
            this.Name = "MyControl";
            this.ResumeLayout(false);

        }

        private System.Windows.Forms.Panel panel1;
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace Axiom.Controls
{
    [Designer(typeof(ParentControlDesigner))]
    public partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public Panel ContentPanel
        {
            get
            {
                return this.panel1;
            }
        }
    }

    internal class MyControlDesigner : ControlDesigner
    {
        public override void Initialize(IComponent component)
        {

            base.Initialize(component);

            MyControl control = component as MyControl;

            EnableDesignMode(control.ContentPanel, "ContentPanel");
        }
    }
}
对于在设计时将控件拖放到自定义用户控件中的容器控件上的问题,我发现了另一个相关的问题/答案:


  • 我遵循上述文章,在设计时成功地将工具箱控件拖放到自定义用户控件中的容器控件上。

    您是否尝试过在设计时将用户控件设置为底部?

    问题非常简单。您说您已经创建了一个UserControl,然后向其中添加了一个面板控件,该控件被停靠以填充整个UserControl

    因此,无论何时在设计时将控件添加到UserControl,都不是将它们添加到Panel控件,而是添加到UserControl本身。这导致它们被填充整个UserControl的Panel控件覆盖

    将它们放到前面是一个临时解决方案,因为这会将它们放在面板控件的顶部。但是,它不会将它们放置在面板控件中,这就是为什么在重建项目时它们会再次“消失”的原因。它们实际上并没有消失,它们只是再次被面板控件隐藏,因为默认的Z顺序排列使它们位于面板下方

    现在还不清楚你为什么需要面板控制。如果它填满了整个用户控件,那么它似乎没有任何作用。UserControl已经是容器控件,因此不需要面板。尝试将其从UserControl中删除,然后可以在设计时添加任何其他控件,而不会被停靠面板覆盖


    如果必须让面板控件填充用户控件,则需要添加一行代码,以便在设计时自动将要放置到用户控件上的控件添加到面板控件的集合中。

    谢谢!这就解决了问题。我不需要面板,现在也不再需要内部的“MyControlDesigner”类。我从另一篇关于这个主题的在线文章中提取了这段代码,并期望将控件添加到特定的面板中。我假设此行导致面板接收拖动的控件:EnableDesignMode(control.ContentPanel,“ContentPanel”)@Elan:我怀疑这不起作用,因为您没有通过该站点将
    INestedContainer
    类作为服务公开。报告有更多细节。但总的来说,如果可能的话,您应该避免编写自定义设计器。这是一个非常缺乏文档记录的魔法领域,很难做到正确。在“正常”情况下(没有实现设计器功能):一个新的UserControl,其中有一个面板,“Dock property设置为”Fill,将成为拖放到UserControl上的其他控件的父控件。有时使用填充UserControl的面板有一些很好的理由:通过设置边距、填充,可以在面板周围创建边框,这样当UserControl的多个实例被放入表单上的其他容器中时,这些实例的“Dock属性”设置为“Top”,它们就不会被“卡住”没有明显的边界。