在.NET(Winforms)中的表单中居中控件?
Posted
技术标签:
【中文标题】在.NET(Winforms)中的表单中居中控件?【英文标题】:Centering controls within a form in .NET (Winforms)? 【发布时间】:2010-10-04 05:35:43 【问题描述】:我正在尝试将固定大小的控件置于表单的中心。
出于兴趣,有没有一种不愚蠢的方法?我真正想要的是类似于 text-align css 属性的东西。
目前,我正在将周围窗体的填充属性设置为合适的大小,并将控件的 Dock 属性设置为填充。
【问题讨论】:
简单解决方案here. 【参考方案1】:您可以使用锚点来实现这一点。或者更准确地说是不使用它们。
控件默认锚定在表单的左上角,这意味着当表单大小发生变化时,它们与表单左上角的距离将保持不变。如果将控件锚点更改为左下角,则在调整窗体大小时,控件将与窗体的底部和左侧保持相同的距离。
如果控件已经居中,则在调整大小时关闭某个方向的锚点将使控件保持居中。通常,未锚定的控件保持其与对话框成比例的位置。例如。如果您将控件放置在对话框宽度的 X=75% 处并关闭左/右锚点,则控件将保持其中心在对话框宽度的 X=75% 处。
注意:在 VS2015 中通过属性窗口关闭锚定可能需要输入 None(而不是默认的 Top,Left)
【讨论】:
因此,您可以将控件放置在表单的中心(使用属性面板近似或精确),或者在 Form.Load 事件处理程序中,设置 Control.Left、Control.Top 属性到 Control.Size 和 Form.Size。 太好了,我从没想过退出 Anchor 属性的所有方面,现在如果我调整控件的大小,控件将保持居中。 !太棒了! 那么如果我在表单中放置一个标签,并将其Anchor设置为None,为什么当表单窗口最大化时它不保持在中心? @user1004959 是另一个锚定容器内的标签吗? 太棒了。我在 .net 中使用 UI 已经很多年了,我使用过各种各样的锚点,直到现在我完全不知道将它设置为 None 的(非常有用的)行为。疯狂。【参考方案2】:myControl.Left = (this.ClientSize.Width - myControl.Width) / 2 ;
myControl.Top = (this.ClientSize.Height - myControl.Height) / 2;
【讨论】:
我认为这是正确的答案,即使在运行时调整表单大小时,也可以将控件实际保持在中心位置。 将上述代码添加到 System.Windows.Forms.Form SizeChanged 事件中,瞧。 如果您的控件可以独立于其父窗体更改其大小,这与您希望保持居中的控件的 SizeChanged 事件一起,是保持控件居中的解决方案。 很好的答案,但不适用于多行错误的文本框控件,我发现myControl.Location = new Point(this.Width / 2 - myControl.Width / 2, this.Height / 2 - myControl.Height / 2)
工作正常
如果你想在另一个控件上居中,例如在网格上加载面板,使用下面的方法: private void Form1_SizeChanged(object sender, EventArgs e) PicLoading.Left = dataGridView1.Width / 2; PicLoading.Top = dataGridView1.Height / 2; 【参考方案3】:
由于您没有说明表单是否可以调整大小,因此如果您不关心调整大小,有一个简单的方法(如果您关心,请使用 Mitch Wheats 解决方案):
选择控件 -> 格式(菜单选项) -> 在窗口中居中 -> 水平或垂直
【讨论】:
为什么 mitch 的调整大小的解决方案比锚定在设计器中更好? 是的..它有效。通过使用您的指南:- 选择控制。转到格式-> 在表格中居中-> 选择垂直和水平。然后去锚点,取消选择顶部和左侧(默认控制锚点)..它确实在屏幕上居中..非常好 @EdSykes 如果要保持居中的控件可以独立于表单调整大小。锚定解决方案不会重新定位它并允许控件偏离中心。【参考方案4】:我找到了一个很好的方法,它可以与多个控件一起使用。添加一个包含 3 列的 TableLayout。使中心列具有绝对大小(无论您需要多少空间)。将两个外部列设置为 100%。将面板添加到中心列并添加您需要的任何控件并将它们放置在您想要的位置。该中心面板现在将在您的表单中保持居中。
【讨论】:
好吧,但有时将中心列设置为自动大小更合适。 包含非停靠面板的单个单元格 TableLayoutPanel 也可以正常工作。【参考方案5】:要在其他容器中的面板 o 中居中按钮,请按照以下步骤操作:
-
在设计时设置位置
转到按钮的属性Anchor,并将此值设置为下图
【讨论】:
【参考方案6】:您可以将想要居中的控件放在 Panel 中,并将左右填充值设置为大于默认值的值。只要它们相等并且您的控件固定在面板的两侧,那么它将显示在该面板的中心。然后,您可以根据需要将容器 Panel 锚定到其父级。
【讨论】:
对于多个控件:将控件放在面板上,然后移除面板锚。【参考方案7】:另外,如果要将其对齐到另一个控件的中心:
//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;
【讨论】:
【参考方案8】:它涉及目视它(我想你可以拿出一个计算器并计算),但只需在表单上插入所述控件,然后移除任何锚定(锚点 = 无)。
【讨论】:
您能详细说明一下吗?我无法理解你的回答。 仅供参考,Visual Studio 的表单布局工具栏具有“水平居中”和“垂直居中”按钮,无需“眼球”任何东西。不确定它是否存在于 VS2010 之前,但它非常有用。【参考方案9】:您可以将所有控件放在面板上,然后编写代码将面板移动到表单的中心。
panelMain.Location =
new Point(ClientSize.Width / 2 - panelMain.Size.Width / 2,
ClientSize.Height / 2 - panelMain.Size.Height / 2);
panelMain.Anchor = AnchorStyles.None;
【讨论】:
【参考方案10】:即使调整了窗体或父控件的大小,也要保持控件居中。
-
设置父元素的以下属性(可以通过属性窗口设置):
parentControl.AutoSize = true;
parentControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
-
将此代码放在窗体或父控件的 Resize 事件中(如果该控件在另一个控件内部)。
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;
【讨论】:
【参考方案11】:所以,我目前正在研究分页控件,我想出了以下方法来实现以下结果。
将 PanelLayout 添加到您的容器(例如表单或用户控件) 设置 PanelLayout 属性: 停靠:底部(或顶部) 自动调整大小:错误这将使 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 事件的代码并根据视口宽度移除元素(按钮)来解决这个问题。
【讨论】:
以上是关于在.NET(Winforms)中的表单中居中控件?的主要内容,如果未能解决你的问题,请参考以下文章
.Net WinForms TabControl Steals 专注于表单激活
在 RadListView 中居中特定列(Telerik,Winforms)