编程语言
首页 > 编程语言> > c#-将控件拖放到自定义用户控件上变得隐藏

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

作者:互联网

我创建了一个自定义UserControl,在设计时我支持在其中拖放控件.我的控件正确地放入了我的用户控件,但是一旦放到用户控件上,它们就被隐藏了.为了使添加的控件可见,我必须选择它,然后单击设计时IDE按钮“ Bring to Front”以查看添加的控件.当我重建解决方案时,控件再次被隐藏.

我用以下代码重现了该问题.在IDE中,我创建了一个简单的用户控件“ MyControl”,并向其中添加了一个停靠在“填充”中的面板控件.然后应将此用户控件“ 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;
    }
}

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

更新:

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

> Question
> Referenced Article

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

解决方法:

这个问题真的很简单.您说您已经创建了一个UserControl,然后向其添加了一个Panel控件,该面板控件已停靠以填充整个UserControl.

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

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

目前尚不清楚为什么需要面板控件.如果它填充了整个UserControl,则似乎没有任何作用. UserControl已经是容器控件,因此您不需要面板.尝试将其从UserControl中删除,然后可以在设计时添加所需的任何其他控件,而不会被停靠的Panel遮盖.

如果绝对必须有一个Panel控件来填充UserControl,则需要添加一行代码,该代码行将在设计时自动将拖放到UserControl上的控件添加到Panel控件的Controls集合中.

标签:design-time,drag-and-drop,user-controls,c,winforms
来源: https://codeday.me/bug/20191102/1993570.html