我正在尝试在表单中居中固定大小的控件。
出于兴趣,有没有一种不愚蠢的方式来做到这一点?我真正想要的是类似于 text-align css 属性的东西。
目前,我正在将周围窗体的填充属性设置为合适的大小,并将控件的 Dock 属性设置为填充。
我正在尝试在表单中居中固定大小的控件。
出于兴趣,有没有一种不愚蠢的方式来做到这一点?我真正想要的是类似于 text-align css 属性的东西。
目前,我正在将周围窗体的填充属性设置为合适的大小,并将控件的 Dock 属性设置为填充。
您可以使用anchors来实现这一点。或者更准确地说,不使用它们。
控件默认锚定在表单的左上角,这意味着当表单大小发生变化时,它们与表单左上角的距离将保持不变。如果将控件锚点更改为左下角,则在调整窗体大小时,控件将与窗体的底部和左侧保持相同的距离。
如果控件已经居中,则在调整大小时关闭某个方向的锚点将使控件保持居中。通常,未锚定的控件保持其与对话框成比例的位置。例如,如果您将控件放置在对话框宽度的 X=75% 处并关闭左/右锚点,则控件将保持其中心在对话框宽度的 X=75% 处。
注意: 通过 VS2015 中的属性窗口关闭锚定可能需要输入 None(而不是默认的 Top,Left)
myControl.Left = (this.ClientSize.Width - myControl.Width) / 2 ;
myControl.Top = (this.ClientSize.Height - myControl.Height) / 2;
由于您没有说明表单是否可以调整大小,因此如果您不关心调整大小,则有一种简单的方法(如果您确实关心,请使用 Mitch Wheats 解决方案):
选择控件 -> 格式(菜单选项) -> 在窗口中居中 -> 水平或垂直
我找到了一个很好的方法来做到这一点,它可以与多个控件一起使用。添加一个包含 3 列的 TableLayout。使中心列具有绝对大小(无论您需要多少空间)。将两个外部列设置为 100%。将面板添加到中心列并添加您需要的任何控件并将它们放置在您想要的位置。该中心面板现在将在您的表单中保持居中。
您可以将想要居中的控件放在 Panel 中,并将左右填充值设置为大于默认值。只要它们相等并且您的控件固定在面板的两侧,那么它将显示在该面板的中心。然后,您可以根据需要将容器面板锚定到其父级。
此外,如果要将其对齐到另一个控件的中心:
//The "ctrlParent" is the one on which you want to align "ctrlToCenter".
//"ctrlParent" can be your "form name" or any other control such as "grid name" and etc.
ctrlToCenter.Parent = ctrlParent;
ctrlToCenter.Left = (ctrlToCenter.Parent.Width - ctrlToCenter.Width) / 2;
ctrlToCenter.Top = (ctrlToCenter.Parent.Height - ctrlToCenter.Height) / 2;
它涉及目视它(我想你可以拿出一个计算器并计算),但只需在表单上插入所述控件,然后删除任何锚定(锚点 = 无)。
您可以将所有控件放在面板上,然后编写代码将面板移动到表单的中心。
panelMain.Location =
new Point(ClientSize.Width / 2 - panelMain.Size.Width / 2,
ClientSize.Height / 2 - panelMain.Size.Height / 2);
panelMain.Anchor = AnchorStyles.None;
为了使控件居中,即使窗体或父控件被调整大小。
parentControl.AutoSize = true;
parentControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
controlToCenter.Left = (parentControl.Width- controlToCenter.Width) / 2;
controlToCenter.Top = (parentControl.Height - controlToCenter.Height) / 2;
//adjust this based on the layout of your form
parentControl.Height = this.ClientSize.Height;
所以,我目前正在研究分页控件,我想出了以下方法来实现以下结果。
这将使 PanelLayout 水平居中。现在,在您的代码隐藏中,执行以下操作:
public MyConstructor()
{
InitializeComponent();
for (var i = 0; i<10; i++)
{
AddButton(i);
}
}
void AddButton(int i)
{
var btn = new Button();
btn.Width = 30;
btn.Height = 26;
btn.Text = i.ToString();
this.flowLayoutPanel1.Controls.Add(btn);
btn.Anchor = AnchorStyles.None;
}
然而,有一个ceveat。如果我的表单太小(水平),按钮将“消失”在视口之外。就我而言,这不是问题,但您可以通过编写侦听 Resize 事件的代码并根据视口宽度删除元素(按钮)来解决这个问题。