10

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

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

我经常在各种控件上以各种方式设置锚点,因此如果控件的精心调整布局变得一团糟,简单地调整父级的大小就不会发生。

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

4

3 回答 3

9

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

假设您有一个名为的表单Form1.cs,并且上面已经有控件,例如 linkLabel、checkBoxes、radioButtons 和 progressBar。

诀窍是编辑*.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();
    

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

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

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

块编辑动画 添加到表单中的唯一剩余控件是panel1ok 按钮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();

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


注意:此描述是针对 Visual Studio 进行的,如果您使用的是Visual Studio Code ,则可以通过多光标选择实现相同的效果:键盘快捷键为:   Strg+ Alt+Arrow Up  或  Strg+ Alt+ Arrow Down 。或者,您可以选择,然后按  Ctrl+ Shift+L  将多个光标添加到当前选择的所有出现处。使用多个光标,您键入的任何内容都将在所有光标位置插入/覆盖。

于 2015-04-09T14:44:31.510 回答
8

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

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

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

于 2018-02-19T05:49:14.730 回答
6

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

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

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

脚步:

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

而已。现有控件现在应该是容器的子级。我知道它适用于 VS 2015 及更高版本,但我猜它至少适用于之前的几个版本。

于 2019-10-12T12:49:28.720 回答