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

qoefvg9y  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(72)

这种情况经常发生:我有很多控件,我决定把它们放在一个面板中,不管什么原因--也许是为了更容易一次禁用它们而不影响其他控件,或者隔离一些单选按钮,等等。
我发现在我的控件“下面”添加一个System.Windows.Forms.Panel是一个繁琐的操作。这通常涉及到调整父控件或窗体的大小,这样我就可以将面板添加到与即将占用面板的控件集合相邻的临时空间中,然后将控件拖动到面板上,然后将父控件/窗体大小设置回原来的大小。
我经常在不同的控件上以不同的方式设置锚点,这样简单地调整父控件的大小就不会发生,而不会使精心调整的控件布局变得一团糟。
对于本应如此简单的操作来说,这显然是一个繁琐的过程。有没有一个VS技巧来做到这一点(除了手工编辑设计器生成的文件,这意味着我必须手工选择我想要重新父化的控件的名称)?

xpszyzbs

xpszyzbs1#

没有直接的方法,但有一种变通方法(Visual Studio 2010 - 2022):
假设您有一个名为Form1.cs的表单,并且上面已经有了一些控件,例如linkLabel、checkBoxes、radioButtons和progressBar。
诀窍是编辑*.Designer.cs文件,而不是移动控件。请执行以下操作:
1.将新面板(panel1)放置在Form1上,就像您通常所做的那样(通过使用工具箱),并给予一个大小,以便它覆盖其他控件。
1.关闭窗体(和所有相关文件),然后在解决方案资源管理器中激活“显示所有文件”。现在Form1.Designer.cs变得可见。打开它。
1.找到以下代码,它包含要注册到窗体的控件:

// 
     // 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)。在源代码中将其从一个位置移动到另一个位置,然后使用Alt+Shift(Visual Studio编辑器中的block edit mode-在开始选择之前 * 按住键,并在选择整个块之后 * 释放它们)将this.Controls替换为this.panel1.Controls
x1c 0d1x,添加到表单中的唯一剩余控件是panel1和ok按钮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+向上箭头或Strg+Alt+向下箭头。或者,您可以选择,然后按Ctrl+Shift+L组合键将多个光标添加到当前选择的所有引用。使用多个光标,您键入的任何内容都将在所有光标位置上插入/覆盖。

pprl5pva

pprl5pva2#

马特有一个很好的答案,但这可能会更容易一点。
在窗体上放置一个面板并将Dock设置为full。您将无法看到任何控件。然后打开表单的Document Outline。将每个控件拖放到Panel1上。每个控件都将落在您想要的位置。现在,如果你愿意,你可以通过简单地设置Panel1.Disabled = true来禁用面板中的所有控件。
如果有不希望将控件作为面板的一部分。选择Document Outline中的控件,然后选择Bring to Front。此控件将可见,并且不受设置面板Enable属性的影响。

iqih9akk

iqih9akk3#

这种情况偶尔也发生在我身上,我改变了主意,希望现有控件现在在面板(或其他容器)中。.. GroupBox、FlowLayout等).
大多数时候,微软提供的答案对我来说很好,并记录在这里:Reassign Existing Controls to a Different Parent
不是将容器控件拖到窗体上,而是在现有控件周围“绘制”容器控件的轮廓,然后容器将抓取现有控件并使它们成为子控件。
步骤:
1.在“工具箱”中,单击以选择要使用的容器控件,然后松开鼠标按钮。不要将控件拖动到窗体上。
1.将鼠标移动到现有控件所在的窗体区域,注意指针将变为十字准线,并带有您选择的任何新容器控件的图标。
1.按住鼠标按钮,然后拖动并在现有控件周围绘制新控件的轮廓。小心完全包围所有控件;如果你让新容器控件的边框太靠近一个控件,那么现有的控件就有可能不被包含在内。
1.松开鼠标按钮。
就是这样。现有的控件现在应该是容器的子控件。我知道它在VS 2015和更新版本中工作,但我猜它至少适用于之前的几个版本。

相关问题