如何在现有控件下放置一个新面板?

ror*_*.ap 9 .net visual-studio-2010 visual-studio winforms visual-studio-2019

这种情况经常发生:我布置了很多控件,我决定出于任何原因将它们放入一个面板中——也许是为了更轻松地同时禁用它们而不影响其他控件,或者隔离一些单选按钮等。

我发现System.Windows.Forms.Panel在我的控件“下方”添加一个繁琐的操作。这通常涉及调整我的父控件或表单的大小,以便我可以将面板添加到即将占据面板的控件集合附近的临时空间中,然后将控件拖到面板上,然后将父控件/表单大小设置回以前是什么。

我经常在各种控件上以各种方式设置锚点,以便在没有仔细调整控件布局的情况下,不会简单地调整父控件的大小。

对于本应如此简单的操作,这显然是一个繁琐的过程。是否有 VS 技巧可以执行此操作(除了手动编辑设计器生成的文件,这意味着我必须按要重新父级的名称手动选择控件)?

Mat*_*att 9

没有直接的方法,但有一个可用的解决方法(Visual Studio 2010 - 2019):

假设您有一个Form1.cs已命名的表单,并且上面已经有控件,例如链接标签、复选框、单选按钮和进度条。

诀窍是编辑*.Designer.cs文件而不是四处移动控件。请执行下列操作:

  1. 像往常一样(通过使用工具箱)将新面板 ( panel1) 放在Form1上面,并为其指定大小以覆盖其他控件。
  2. 关闭表单(和所有相关文件),然后在解决方案资源管理器中激活“显示所有文件”。现在Form1.Designer.cs变得可见。打开它。
  3. 找到以下代码,它包含注册到表单的控件:

        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Controls.Add(this.progressBar1);
        this.Controls.Add(this.linkLabel1);
        this.Controls.Add(this.panel1);
        this.Controls.Add(this.checkBox1);
        this.Controls.Add(this.radioButton1);
        this.Controls.Add(this.btnOk);
        this.Name = "Form1";
        this.Text = "Form1";
        this.panel1.ResumeLayout(false);
        this.panel1.PerformLayout();
        this.ResumeLayout(false);
        this.PerformLayout();
    
    Run Code Online (Sandbox Code Playgroud)

然后,查找创建面板的代码:

        // 
        // panel1
        // 
        this.panel1.Location = new System.Drawing.Point(12, 12);
        this.panel1.Name = "panel1";
        this.panel1.Size = new System.Drawing.Size(260, 198);
        this.panel1.TabIndex = 7;
Run Code Online (Sandbox Code Playgroud)

您需要做的就是将控件从表单的Controls集合 ( this.Controls) 移动到面板的Controls集合 ( this.panel1.Controls)。将它从源代码中的一个位置移动到另一个位置,然后使用+(Visual Studio 编辑器中的块编辑模式-开始选择之前按住键,并在选择整个块释放它们)替换为: AltShift this.Controlsthis.panel1.Controls

块编辑动画 添加到表单中的唯一剩余控件是panel1和 确定按钮btnOk

        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Controls.Add(this.panel1);
        this.Controls.Add(this.btnOk);
        this.Name = "Form1";
        this.Text = "Form1";
        this.panel1.ResumeLayout(false);
        this.panel1.PerformLayout();
        this.ResumeLayout(false);
        this.PerformLayout();
Run Code Online (Sandbox Code Playgroud)

最后,Form1.Designer.cs通过双击关闭并重新打开表单Form1.cs。现在您应该看到面板内的控件。位置和以前一样。


注:此说明是为Visual Studio制作,如果你使用Visual Studio代码代替,就可以实现与同多光标选择:键盘快捷键:   Strg+ Alt+Arrow Up  或  Strg+ Alt+ Arrow Down 。或者,您可以选择,然后按  Ctrl+ Shift+L  将多个光标添加到当前选择的所有出现处。使用多个光标,您键入的任何内容都将在所有光标位置插入/覆盖。

  • 别客气。你知道,你最近帮助了我,所以我想让我们选择一个你未回答的问题并回答它们。这就是推动 Stackoverflow 并使其如此强大的原因。:-) (3认同)

Dav*_*pel 7

马特有一个很好的答案,但这可能会更容易一些。

在表单上放置一个面板并设置Dock为完整。您将无法看到任何控件。然后打开Document Outline表单。将每个控件拖放到Panel1. 每个控件都将落在您想要的位置。现在,如果您愿意,您可以通过简单地设置来禁用面板中的所有控件Panel1.Disabled = true

如果您不想将某些控件作为面板的一部分。选择 中的控件Document Outline并选择Bring to Front。此控件将可见且不受设置面板启用属性的影响。


Gen*_*1-1 6

这也偶尔发生在我身上,我改变主意并希望现有控件现在位于面板(或其他一些容器...GroupBox、FlowLayout 等)中。

大多数情况下,Microsoft 提供的答案对我来说效果很好,并记录在此处:将现有控件重新分配给不同的父级

不是将容器控件拖到窗体上,而是在现有控件周围“绘制”容器控件的轮廓,然后容器将抓取现有控件并使它们成为子项。

脚步:

  1. 在工具箱中,单击以选择要使用的容器控件,然后松开鼠标按钮。不要将控件拖到窗体上。
  2. 将鼠标移动到现有控件所在的表单区域,注意指针变为十字准线,带有您选择的任何新容器控件的图标。
  3. 按住鼠标按钮,然后在现有控件的“周围”拖动并绘制新控件的轮廓。小心完全包围所有控件;如果新容器控件的边框离控件太近,则可能不会包含现有控件。
  4. 松开鼠标按钮。

就是这样。现有控件现在应该是容器的子项。我知道它适用于 VS 2015 及更新版本,但我猜它至少适用于之前的几个版本。