我已经阅读了几个堆栈溢出问题而没有找到解决问题的好方法。每当调整表单大小时,如何调整控件的大小?当形式变大或变小时,我希望它们变得更大或更小。
在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();
*/
}
如果我在另一个堆栈溢出问题上忽略了一个实际的工作代码示例,我很乐意看到它,但我发现的那些与上面那些无法正常工作的相似。
也许我在滥用它,有人可以发布示例代码,以便向我们这些不断询问此问题如何解决问题的人展示。
另外,我尝试过使用一些锚点/对接工具,认为他们会自动允许它,但事实并非如此。
答案 0 :(得分:17)
最好的选择是使用TableLayoutPanel
。将TableLayoutPanel
放在表单上,将Dock
属性设置为Fill
,创建所需的行和列,并将控件放在单元格内。当然,您需要在单元格内的控件上设置Dock/Anchor
,以便它们响应单元格大小的更改。在某些情况下,您可能需要将Panel
放入单元格并将控件放入其中,因为每个单元格只能包含一个控件。您可能还需要在控件上设置RowSpan
/ ColumnSpan
。
使用TableLayoutPanel
,您可以完全控制如何安排cotrols。您可以为行和列设置绝对或百分比大小。
答案 1 :(得分:5)
使用控件的Anchor。有一个选项可以固定顶部,底部,左侧和右侧。你很高兴。
答案 2 :(得分:1)
您在代码中尝试做的是更改控件的大小,这不是一个好方法。通常,在重新调整表单大小时,不应更改按钮和文本框的大小,但它们通常需要移动(更改位置)。某些控件确实需要根据重新调整大小的形式更改大小,但在大多数情况下只需要一个维度。用于工作区域的中央控件(如果您正在开发用于绘图的工具)应更改两个尺寸的大小。所有这些都可以通过正确设置控件的Dock和/或Anchor属性来实现。
textBox1.Dock = DockStyle.Bottom;
textBox1.Anchor = AnchorStyles.Bottom & AnchorStyles.Left;
使用设计器时,所有这些都可以在“属性”面板中轻松设置。
但如果这对您来说还不够,在极少数情况下,您肯定只想更改控件的位置:
textBox1.Location = new Point(newX, newY);
答案 3 :(得分:1)
我找到了一个适合我的替代解决方案,感谢对解决方案的任何负面或正面评论。
在不同区域的Split Containers中使用多个Split Containers和Split Containers,我可以分割布局的主要部分,并在那里利用Docking和Anchoring,我能够完成我想要做的事情 - 它工作得非常好。
我想指出我知道网上有些人提到拆分容器会占用大量资源。
答案 4 :(得分:1)
如果您的控件位于组框中,请务必设置组框属性以调整大小。盒子内的控件由盒子控制。框大小(除非它在另一个框内)由表单控制。