在.NET 中的窗体中居中控件(Winforms) ?

我试图在窗体中集中一个固定大小的控件。

出于好奇,有没有不傻的方法?我真正想要的是一些类似于文本对齐 css 属性的东西。

目前,我正在将周围窗体的填充属性设置为适当的大小,并将控件的 Dock 属性设置为填充。

216750 次浏览

你可以通过使用 来达到这个目的,或者更准确地说,使用 不用它们

默认情况下,控件锚定在窗体的左上角,这意味着当窗体大小更改时,控件与窗体左上角的距离将保持不变。如果将控件锚点更改为左下角,则在调整窗体大小时,控件将与窗体的左下角保持相同的距离。

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

注意: 通过 VS2015中的属性窗口关闭锚定可能需要输入“无”(而不是默认的左上角)

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

它包括目测它(我想你可以拿出一个计算器并计算) ,但只需在表单上插入所述控件,然后删除任何锚定(锚 = 无)。

因为你没有声明表单是否可以调整大小,所以如果你不在乎调整大小,有一个简单的方法(如果你在乎,就用 Mitch Wheats 的解决方案) :

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

我找到了一个很好的方法来做到这一点,它将工作与多个控制。添加一个包含3列的 TableLayout。使中心列的绝对大小(无论你需要多少空间)。将两个外部列设置为100% 。将 Panel 添加到中心列,并添加所需的任何控件,然后将它们放置在所需的位置。中间的面板现在将保持在你的形式中心。

您可以将要居中的控件放在 Panel 中,并将左右填充值设置为大于默认值的值。只要它们是相等的,并且你的控制被锚定到面板的侧面,那么它将出现在面板的中心。然后,您可以根据需要将容器面板锚定到其父级。

在面板 o 的其他容器中将 Button 居中,请按照下面的步骤操作:

  1. 在设计时设置位置
  2. 转到按钮的属性 ,并将此值设置为如下图像

enter image description here

您可以将所有控件放到面板上,然后编写代码将面板移动到窗体的中心。

panelMain.Location =
new Point(ClientSize.Width / 2 - panelMain.Size.Width / 2,
ClientSize.Height / 2 - panelMain.Size.Height / 2);


panelMain.Anchor = AnchorStyles.None;

此外,如果要将其对齐到另一个控件的中心:

//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;

为了保持控件居中,甚至调整了窗体或父控件的大小。

  1. 设置父元素 (您可以通过属性窗口设置它的以下属性) :
    parentControl.AutoSize = true;
parentControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
  1. 将此代码放在窗体或父控件 (如果控件在另一个控件内)的 Resize 事件中。
    controlToCenter.Left = (parentControl.Width- controlToCenter.Width) / 2;
controlToCenter.Top = (parentControl.Height - controlToCenter.Height) / 2;
  1. 如果父控件停靠在窗体上,则添加以下代码行。
       //adjust this based on the layout of your form
parentControl.Height = this.ClientSize.Height;

因此,我目前正在进行一个分页控件的工作,我想出了以下方法来实现下面的结果。

example

  • 向容器中添加 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;
}

然而,这里有一个警告。如果我使我的窗体太小(水平)按钮将“消失”以外的视窗。在我的例子中,这不是一个问题,但是您可以通过编写侦听 Resize 事件的代码,并根据 viewport Width 删除元素(按钮)来解决这个问题。