C# 在.Net GroupBox中定位控件
通常,我使用下面的方法编写可调整大小(优雅)的表单C# 在.Net GroupBox中定位控件,c#,winforms,user-interface,controls,groupbox,C#,Winforms,User Interface,Controls,Groupbox,通常,我使用下面的方法编写可调整大小(优雅)的表单 using System.Drawing; using System.Windows.Forms; namespace silly { public class Form1 : Form { private GroupBox g; private Button b1, b2; public Form1() { Init();
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
属性不同。我一直在做的是添加一个点
,其值如下:
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
客户端区域。我在这里追求的效果是,每个按钮都填满了他一半的客户区
提前谢谢
我尝试了Dock
和Anchor
,但我做不到
好像是让他们做按钮的
填写GroupBox
客户区。这个
我想要的效果是每一个
按钮来填充他一半的客户
区域
将TableLayoutPanel
添加到GroupBox
将其Dock
属性设置为Fill
设置其RowCount=2
和ColumnCount=1
将每行的行样式设置为50%。默认情况下在设计器中完成
将两个按钮添加到TableLayoutPanel
将其Dock
属性设置为Fill
完成了李>
我还建议再给设计师一次机会——这真的很好 如果仍要使用手动布局代码,请使用DisplayRectangle
属性,而不是ClientRectangle
。我更喜欢布局
事件,而不是调整大小
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);
}
然而,请注意,其中指出:
此API支持.NET Framework
基础设施,而不是
可以直接从代码中使用
我打算建议抛锚停泊。我看不出有什么问题。虽然你不喜欢他们,但他们在那里,所以你可以做你想做的事情。您可以单击浏览,也可以尝试用代码将其拆分。我更喜欢点击。你不喜欢锚定
的哪些方面?是因为你不用设计师吗?我不用设计师。我通常不喜欢所见即所得,因为尽管在简单的情况下它可能非常有效,但复杂的情况往往会变得指数级复杂。要对布局进行精细控制,手动布局是一种方式,到目前为止,对我来说,键入布局代码可能比使用设计器快得多,更不用说修改布局代码了!!我修改了问题,允许Dock
和Anchor
回答。我真的无法忍受使用鼠标:没有办法加快速度!此外,使用营利性IDE让我大错特错:)也许如果设计者允许一组丰富的键盘命令。。。