10

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

在 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();
*/
}

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

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

此外,我尝试使用一些锚/对接工具,认为它们会自动允许它,但它没有。

4

5 回答 5

23

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

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

于 2013-03-04T07:01:53.540 回答
7

使用控件的。有一个锚定顶部、底部、左侧和右侧的选项。你可以走了。

于 2013-02-28T09:25:42.457 回答
2

我找到了一个对我来说效果很好的替代解决方案,感谢对该解决方案的任何负面或正面评论。

在不同区域的拆分容器中使用多个拆分容器和拆分容器,我可以分割布局的主要部分,并在其中使用对接和锚定,我能够完全完成我想做的事情 - 它工作得很好。

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

于 2014-01-29T21:02:15.640 回答
2

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

于 2014-03-19T23:36:55.280 回答
1

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

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

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

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

textBox1.Location = new Point(newX, newY);
于 2013-02-28T09:44:59.907 回答