使用表单resize调整控件大小

我已经阅读了几个堆栈溢出问题,但没有为我的问题找到一个好的解决方案。 每当调整表单大小时,如何调整控件的大小? 当forms变大或变小时,我希望它们变大或变小。

在visual basic中,这很容易用form.Zoom属性(当然不需要调整控件的大小,但解决了我需要的东西)。 不幸的是,这在C#winforms中不可用。

以下是我没有运气的其他一些事情:

private void formMain_Resize(object sender, EventArgs e) {/* double scale; this.scaleWidth = (float)this.Width / (float)this.origWidth; this.scaleHeight = (float)this.Height / (float)this.origHeight; if (this.scaleHeight > this.scaleWidth) { scale = this.scaleHeight; } else { scale = this.scaleWidth; } foreach (Control control in this.Controls) { control.Height = (int)(control.Height * this.scaleHeight); control.Width = (int)(control.Width * this.scaleWidth); this.Refresh(); // control.Font = new Font("Verdana", control.Font.SizeInPoints * heightRatio * widthRatio); } ///////This scaling didnt work for me either //this.Scale(new SizeF(this.scaleWidth, this.scaleHeight)); //this.Refresh(); */ } 

如果我在另一个堆栈溢出问题上忽略了一个实际工作的代码示例,我很乐意看到它,但我发现的那些与上面那些不起作用的类似。

也许我在滥用它,有人可以发布示例代码,以便向我们这些不断询问这个问题如何解决问题的人展示。

此外,我已经尝试使用一些锚定/对接工具,认为他们会自动允许它,但事实并非如此。

最好的选择是使用TableLayoutPanel 。 将TableLayoutPanel放在窗体上,将Dock属性设置为Fill ,创建所需的行和列,并将控件放在单元格内。 当然,您需要在单元格内的控件上设置Dock/Anchor ,以便它们响应单元格大小的更改。 在某些情况下,您可能需要将Panel放入单元格并将控件放入其中,因为每个单元格只能包含一个控件。 您可能还需要在控件上设置RowSpan / ColumnSpan

通过使用TableLayoutPanel ,您可以完全控制如何安排cotrols。 您可以为行和列设置绝对或百分比大小。

使用控件的锚点 。 有一个选项可以固定顶部,底部,左侧和右侧。 你很高兴去。

您在代码中尝试做的是更改控件的大小,这不是很好的方法。 通常,在重新调整表单大小时,不应更改按钮和文本框的大小,但它们通常需要移动(更改位置)。 某些控件确实需要根据重新resize的forms更改大小,但在大多数情况下只需要一个维度。 用于工作区域的中央控件(如果您正在开发用于绘图的工具)应更改两个尺寸的大小。 所有这些都可以通过正确设置控件的Dock和/或Anchor属性来实现。

 textBox1.Dock = DockStyle.Bottom; textBox1.Anchor = AnchorStyles.Bottom & AnchorStyles.Left; 

使用设计器时,所有这些也可以在“属性”面板中轻松设置。

但如果这对你来说还不够,在极少数情况下,你肯定只想改变控件的位置:

 textBox1.Location = new Point(newX, newY); 

我找到了一个适合我的替代解决方案,感谢对解决方案的任何负面或正面评论。

在不同区域的Split Containers中使用多个Split Containers和Split Containers,我可以分割布局的主要部分,并在那里利用Docking和Anchoring,我能够完成我想要做的事情 – 它工作得非常漂亮。

我想指出我知道有些人在网上提到拆分容器会占用大量资源。

如果控件位于组框中,请确保将组框属性设置为resize。 盒子内的控件由盒子控制。 框大小(除非它在另一个框内)由表单控制。