通常,我使用下面的方法编写可调整大小(优雅地)的表单。
using System.Drawing;
using System.Windows.Forms;
namespace silly
{
public class Form1 : Form
{
private GroupBox g;
private Button b1, b2;
public Form1()
{
Init();
}
private void Init()
{
//create and add controls.
this.Controls.Add(g = new GroupBox());
g.Controls.AddRange(new Control[] {
b1 = new Button(),
b2 = new Button()});
g.Text = "group";
b1.Text = "b1";
b2.Text = "b2!";
b1.AutoSize = b2.AutoSize = true;
g.Resize += new System.EventHandler(g_Resize);
}
private void g_Resize(object sender, System.EventArgs e)
{
b1.Size = b2.Size = new Size(g.ClientSize.Width, g.ClientSize.Height/2);
b1.Location = Point.Empty;
b2.Location = new Point(b1.Left, b1.Bottom);
}
protected override void OnResize(System.EventArgs e)
{
g.Size = this.ClientSize;
g.Location = Point.Empty;
}
}
}
但是,您很快就会注意到g.ClientSize
属性不像Form.ClientSize
属性那样工作。我一直在做的是添加Point
值:
private readonly static Point grp_zero = new Point(10, 20);
帮助正确放置组件。使用此值,我可以使用:
重构g_Resize
方法
b1.Size = b2.Size = new Size(g.ClientSize.Width - grp_zero.X * 2,
g.ClientSize.Height/2 - grp_zero.X - grp_zero.Y);
b1.Location = grp_zero;
b2.Location = new Point(b1.Left, b1.Bottom);
结果相当不错。但是,如果在Init();
的末尾,则会找到以下代码:
g.Font = new Font(g.Font.FontFamily, 28);
或类似名称,grp_zero
值得调整大小。
问题
对这种疯狂有没有好的解决方法?你做什么的?
我尝试了Dock
和Anchor
,但我似乎无法让它们使按钮填满GroupBox
客户区。我在这之后的效果是每个按钮填充他的一半客户区。
提前致谢。
答案 0 :(得分:4)
我尝试了
Dock
和Anchor
,但我做不到 似乎让他们制作按钮 填写GroupBox
客户区。该 效果我在这之后就是每个人 按钮填充他的一半客户端 区域。
TableLayoutPanel
添加GroupBox
Dock
属性设置为Fill
RowCount = 2
和ColumnCount = 1
RowStyles
到50%的填充。默认情况下在设计器中完成。TableLayoutPanel
Dock
属性设置为Fill
我还建议给设计师另一个机会 - 它真的非常好!
答案 1 :(得分:3)
如果您仍想使用手动布局代码,请使用DisplayRectangle
属性而不是ClientRectangle
。我更喜欢Layout
事件而不是Resize
。
private void g_Layout(object sender, System.LayoutEventArgs e)
{
b1.Size = b2.Size = new Size(g.DisplayRectangle.Width,
g.DisplayRectangle.Height/2 - 1);
b1.Location = new Point(g.DisplayRectangle.Left,
g.DisplayRectangle.Top);
b2.Location = new Point(g.DisplayRectangle.Left,
g.DisplayRectangle.Top + g.DisplayRectangle.Height/2);
}
但请注意,the documentation表示:
此API支持.NET Framework 基础设施并不打算 直接在您的代码中使用。