将控件拖放到自定义用户控件上会隐藏

本文关键字:控件 隐藏 用户 自定义 拖放 | 更新日期: 2023-09-27 17:50:21

我创建了一个自定义UserControl,我支持在设计时拖放控件。我的控件被正确地拖放到用户控件中,但是一旦拖放到用户控件中,它们就隐藏起来了。为了使添加的控件变得可见,我必须选择它并单击设计时IDE按钮"Bring To Front"以查看添加的控件。当我重新构建解决方案时,控件再次隐藏。

我用下面的代码重现了这个问题。在IDE中,我创建了一个简单的用户控件"MyControl",我添加了一个单独的Panel控件停靠到"Fill"。这个用户控件"MyControl"应该被放到一个Windows面板上。然后,将另一个控件(如Label或button控件)拖放到用户控件上,它就会隐藏起来。

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

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;
    }
}

MyControl.cs:

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");
        }
    }
}

更新:

我发现了另一个相关的问题/答案,在设计时将控件拖放到自定义用户控件中的容器控件上:

  1. 引用文章

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

将控件拖放到自定义用户控件上会隐藏

这个问题真的很简单。你说你已经创建了一个UserControl,然后添加了一个Panel控件,它被停靠来填充整个UserControl。

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

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

不清楚你为什么需要Panel控件。如果它填满了整个UserControl,它似乎没有任何用途。UserControl已经是一个容器控件,所以你不需要Panel。试着从你的UserControl中删除它,然后你就可以在设计时添加任何你想要的控件,而不会被停靠的面板覆盖。

如果你绝对需要一个Panel控件填充你的UserControl,你需要添加一行代码,自动将在设计时被拖放到UserControl上的控件添加到Panel控件的Controls集合

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