将控件对齐到FlowLayout中心

我有一个flowlayout如下:

在此处输入图像描述

我需要将窗体上的所有控件居中(换句话说,假设窗体的宽度为200. btnOpt1到btnOpt4应该让它们的Left开始于100减去按钮宽度的一半, 而不是0。

您可以通过两种方式实现,但每种方式都有一些限制。

  1. 使用Anchor属性
  2. DockingAnchor属性的帮助下使用布局控件。

方法1:锚属性

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

在resize时,关闭方向上的锚点将使控件保持在该方向的中心位置。

示例:

 public TestForm12() { InitializeComponent(); Button btn = new Button(); btn.Width = this.Width - 10; btn.Height = 20; btn.Left = (this.ClientSize.Width - btn.Width) / 2; btn.Top = (this.ClientSize.Height - btn.Height) / 2; btn.Text = "click me"; this.Controls.Add(btn); btn.Anchor = AnchorStyles.None; } 

2.使用布局控件

  1. 添加TableLayout控件,将其Dock属性设置为Fill。
  2. 添加1行,大小类型样式百分比100%
  3. 添加3列Column1(尺寸类型 – 百分比(100%)),Column2(尺寸类型 – 绝对(200px)),Column3(尺寸类型 – 百分比(100%))。
  4. 现在将Panel Control添加到Column2并将其Dock属性设置为Fill
  5. 向此控件添加按钮并根据需要设置其大小,并将其Anchor属性设置为AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top

示例 – 表单的Designer.cs代码段。

 private void InitializeComponent() { this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.panel1 = new System.Windows.Forms.Panel(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.tableLayoutPanel1.SuspendLayout(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // tableLayoutPanel1 // this.tableLayoutPanel1.ColumnCount = 3; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 200F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel1.Controls.Add(this.panel1, 1, 0); this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.RowCount = 1; this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel1.Size = new System.Drawing.Size(284, 262); this.tableLayoutPanel1.TabIndex = 0; // // panel1 // this.panel1.Controls.Add(this.button2); this.panel1.Controls.Add(this.button1); this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Location = new System.Drawing.Point(45, 3); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(194, 256); this.panel1.TabIndex = 0; // // button1 // this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.button1.Location = new System.Drawing.Point(3, 9); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(188, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; // // button2 // this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.button2.Location = new System.Drawing.Point(3, 38); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(188, 23); this.button2.TabIndex = 0; this.button2.Text = "button1"; this.button2.UseVisualStyleBackColor = true; // // TestForm11 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Controls.Add(this.tableLayoutPanel1); this.Name = "TestForm11"; this.Text = "TestForm11"; this.tableLayoutPanel1.ResumeLayout(false); this.panel1.ResumeLayout(false); this.ResumeLayout(false); } #endregion private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button1; 

希望这有帮助..

我会改用TableLayoutPanel :

  • 将TableLayoutPanel放在表单上
  • 设置停靠样式Fill面板
  • 在面板内只留一列
  • 为每个按钮创建行(并将按钮放到表格单元格)
  • 设置行大小类型Autosize大小
  • 设置停靠样式Fill每个按钮,除了最后一个按钮
  • 设置停靠方式Top按钮

在你的解决方案中BTW你应该迭代flowLayoutPanel控件而不是表单控件。 还可以考虑从宽度中减去水平边距和填充:

 foreach (Control control in flowLayoutPanel.Controls) { control.Size = new Size(flowLayoutPanel.Width - control.Margin.Horizontal, control.Height); } 

但我建议你改用TableLayoutPanel。

我通过改变边际值来解决这个问题。 我将我的内容添加到面板中。

C#:

 int horizontalMargin = (int)(0.5 * (this.containingPanelOrForm.Width - this.button.Width)); this.btnOptX.Margin = new Padding(horizontalMargin, 0, horizontalMargin, 0); 

或者您可以使用网格布局。

我不擅长C#,但你也可以在flowlayoutpanel中添加一个与flowlayoutpanel宽度相同的面板。 然后,您可以在运行时创建的面板中添加所需的按钮,并将底座设置为向左或向右。 如你所愿。 让我在VB.net和C#中展示一个例子(用于在线转换)

VB.net

  Dim btn As New Button btn.Text = "Example" btn.Name = "Button" btn.Size = New Size(60,10) Dim panel As New Panel panel.Size = New Size(FlowLayoutPanel1.Width, 10) 'size of the flowlayoutpanel + height of button btn.Dock = DockStyle.Right FlowLayoutPanel1.Controls.Add(panel) panel.controls.add(btn) 

C#

 Button btn = new Button(); btn.Text = "Example"; btn.Name = "Button"; btn.Size = new Size(60, 10); Panel panel = new Panel(); panel.Size = new Size(FlowLayoutPanel1.Width, 10); //size of the flowlayoutpanel + height of button btn.Dock = DockStyle.Right; FlowLayoutPanel1.Controls.Add(panel); panel.controls.@add(btn); 

使用Name = lblEmpty和AutoSize = False创建空Label。 将此控件放在FlowLayoutPanel1的控件列表中,然后在下面添加代码。

示例:假设FlowLayoutPanel1中有三个现有标签,结果应该是lblEmpty,LabelExisting1和LabelExisting2。

 Dim MarginLabelEmpty As Integer = ((FlowLayoutPanel1.Width - (LabelExisting1.Width + LabelExisting2.Width)) / 2) lblEmpty.Width = MarginLabelEmpty 

我通过创建此代码解决了我的问题。

在使用Button Controls的情况下,使用.Text =“” )创建4个新标签,并将每个标签放在每个按钮的开头, 命名标签如下:lblEmpty1,lblEmpty2,lblEmpty3,lblEmpty4。

然后添加以下代码:

 Dim MarginLeftbtnOptAll As Integer = ((FlowLayoutPanel1.Width - btnOpt1.Width) / 2) lblEmpty1.AutoSize = False lblEmpty1.Width = MarginLeftbtnOptAll lblEmpty2.AutoSize = False lblEmpty2.Width = MarginLeftbtnOptAll lblEmpty3.AutoSize = False lblEmpty3.Width = MarginLeftbtnOptAll lblEmpty4.AutoSize = False lblEmpty4.Width = MarginLeftbtnOptAll 

此中心按钮,根据FlowLayoutPanel1的宽度增加空标签的宽度