在.NET (Winforms)中如何将控件居中于表单?

156

我试图在一个表单中居中一个固定大小的控件。

顺便问一下,有没有一种非白痴式的方法来做到这一点?我真正想要的是类似于text-align css属性的东西。

目前,我将周围表单的padding属性设置为适当的大小,并将控件的Dock属性设置为fill。


这里有一个简单的解决方案:链接 - Adam
11个回答

284

您可以通过使用锚点来实现这一点。更确切地说,是不使用锚点

控件默认情况下会被锚定在表单的左上角,这意味着当表单大小改变时,它们距离表单左上角的距离将保持不变。如果您将控件锚定到左下角,则在调整表单大小时,控件将保持与表单底部和左侧相同的距离。

关闭某个方向上的锚定将使控件在调整大小时保持居中,如果它已经居中。一般来说,未锚定的控件将保持其相对于对话框的比例位置。例如,如果您将一个控件放置在对话框宽度的X=75%处,并关闭左/右锚点,则该控件将保持其中心在对话框宽度的X=75%处。

注意:在VS2015的属性窗口中关闭锚定可能需要输入 None(而非默认的Top,Left)。


因此,您可以将控件放置在窗体的中心(使用属性面板近似或精确),或者在Form.Load事件处理程序中根据Control.Size和Form.Size设置Control.Left、Control.Top属性。 - maxwellb
2
那么,如果我将标签放置在表单的中心并将其锚定设置为无,则当最大化表单窗口时,为什么它不会保持在中心位置呢? - user1004959
4
太棒了。我多年来一直在使用 .net 中的用户界面(UI),尝试了各种各样的锚定变体,但我完全不知道将其设置为“无”(None)可以产生如此有用的效果,直到现在才发现。太疯狂了。 - neminem
您还需要将 Dock 设置为 Fill。此外,我需要在一个面板内放置标签。 - MrFox
@MrFox 这取决于你的使用情况。通常情况下,你不需要这样做。 - splattne
显示剩余7条评论

133
myControl.Left = (this.ClientSize.Width - myControl.Width) / 2 ;
myControl.Top = (this.ClientSize.Height - myControl.Height) / 2;

3
我认为这是正确的答案,可以在运行时调整窗体大小时保持控件位于中心位置。 - user1004959
20
将上述代码添加到 System.Windows.Forms.Form 的 SizeChanged 事件中,完成。 - Zignd
1
这个方法,结合你想要保持居中的控件的SizeChanged事件,是解决方案,可以让你的控件在其父窗体之外独立改变大小时仍然保持居中。 - Skyqula
非常好的答案,但不适用于多行文本框控件,我发现简单地使用 myControl.Location = new Point(this.Width / 2 - myControl.Width / 2, this.Height / 2 - myControl.Height / 2) 可以正常工作。 - Ricky Divjakovski
如果您想将一个控件居中显示在另一个控件上,例如将加载面板居中显示在网格上,请使用以下代码: private void Form1_SizeChanged(object sender, EventArgs e) { PicLoading.Left = dataGridView1.Width / 2; PicLoading.Top = dataGridView1.Height / 2; } - M. Fawad Surosh

53

鉴于您没有说明表单是否可以调整大小,如果您不关心调整大小(如果您关心,请使用Mitch Wheats的解决方案),则有一种简单的方法:

选择控件-> 格式(菜单选项)-> 在窗口中心对齐->水平或垂直


2
为什么Mitch的调整大小解决方案比在设计师中使用锚定更好? - Ed Sykes
是的,它有效。按照您的指南操作:选择控件。转到格式 --> 在表单中心 --> 选择垂直和水平。然后转到锚点,取消选择顶部和左侧(默认控件锚点)...它确实居中显示在屏幕上...非常好。 - Luiey
如果您想要保持居中的控件可以独立于窗体进行调整大小,则锚定解决方案将不会重新居中它,并允许控件向偏离中心的方向增长。@EdSykes - Skyqula
这是最好的答案。我花了很多时间手动对齐控件。 - undefined

10

我找到了一个非常好的方法来实现这个,它适用于多个控件。添加一个TableLayout,其中包含3列。将中间列设置为绝对大小(根据需要设置大小)。将两个外部列设置为100%。在中间列添加一个面板,并添加任何所需的控件并将它们放置在所需位置。那个中心面板现在将保持在您的表单中心。


好的,但有时将中心列设置为自动大小更合适。 - CoolMagic
一个包含未停靠面板的单个单元格TableLayoutPanel也可以正常工作。 - Larry

4
此外,如果你想将它与另一个控件居中对齐:
//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;

4

要在容器中居中按钮,请按照以下步骤进行:

  1. 在设计时设置位置
  2. 进入按钮的锚定属性,将该值设置为以下图像所示

enter image description here


2

您可以将要居中的控件放在一个面板中,并将左右填充值设置为大于默认值。只要它们相等并且您的控件已经固定到面板的两侧,那么它就会居中出现在该面板中。然后,您可以根据需要将容器面板固定到其父容器上。


2
对于多个控件:将控件放在一个面板上,然后移除面板的锚定。 - Graham Laight

0

所以,我目前正在开发一个分页控件,并想出了以下方法来实现下面的结果。

example

  • 向您的容器(如表格或用户控件)添加 PanelLayout
  • 设置 PanelLayout 属性:
    • Dock:底部(或顶部)
    • AutoSize:False

这将使 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;
    }

然而,这里有一个警告。如果我将表单的水平大小调整得太小,按钮将会在视口之外“消失”。在我的情况下,这不是问题,但您可以编写监听调整大小事件的代码,并根据视口宽度删除元素(按钮)来解决此问题。


0

即使调整了表单或父控件的大小,也要保持控件居中。

  1. 设置父元素的以下属性(您可以通过属性窗口设置)
    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; 

0

这涉及到目测(好吧,我想你可以拿出计算器来计算),但只需在表单上插入所述控件,然后删除任何锚定(anchor = None)。


请您能否详细说明一下?我无法理解您的回答。 - Mitch Wheat
在我试图快速回答的时候(我总是被 StackOverflow 上的其他人抢先了),我想表达的是用户 splattne 更为优雅的说法:关闭你想要居中的控件的锚定。 - t3rse
2
提供资讯,Visual Studio的窗体布局工具栏有"水平居中"和"垂直居中"按钮,可以消除对齐时需要"凭感觉调整"的需求。不确定这个功能在VS2010之前是否存在,但它非常实用。 - Dan Bechard
请注意,Dan Bechard提到的水平居中和垂直居中在默认情况下不会显示在工具栏中,您需要启用它们。 - Mihai Drebot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接