Вопрос по .net, c# – Выровняйте элементы управления по центру в FlowLayout

16

У меня есть flowlayout следующим образом:

enter image description here

Мне нужно центрировать все элементы управления на форме (другими словами, допустим, ширина формы составляет 200. От btnOpt1 до btnOpt4 должны быть своиLeft начиная с 100 минус половина ширины кнопки,not 0.)

@NiranjanKala И то, и другое было хорошо в отношении реализации. Но я убрал второй, чтобы вы были счастливы и оставались актуальными. David
FLowLayout не предназначен для этого. SLaks
попробуйте использовать панель Likurg
@SLaks вы можете порекомендовать альтернативу? David
ты знаешь что ты пытаешься реализовать ?? Ваша первая точка противоречит второй точке, касающейся макета. При каком условии вы вернете их обратно в соответствии с вашим первым условием ?? ... вместо использования панели разветвления, поместите элемент управления в панель и затем используйте свойство привязки или свойство док-станции согласно ваше требование .. Niranjan Singh

Ваш Ответ

5   ответов
2

изменив значения маржи. Я добавляю свой контент на панель, хотя.

C#:

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

Using Anchor property Using the layout control with help of Docking and Anchor properties.

Method 1: Anchor Property

Controls are anchored by default to the top left of the form which means when the form size will be changed, their distance from the top left side of the form will remain constant. If you change the control anchor to bottom left, then the control will keep the same distance from the bottom and left sides of the form when the form if resized.

Turning off the anchor in a direction will keep the control centred in that direction when resizing.

Пример :

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. Using the layout control

Add TableLayout Control, Set it’s Dock property to Fill. Add 1 Row with Size Type style Percent 100% Add 3 Columns Column1(Size Type – Percent(100%)), Column2(Size Type – Absolute(200px)), Column3(Size Type – Percent(100%)). Now Add Panel Control to Column2 and Set it’s Dock property to Fill Add Buttons to this control and set their Size as you want and Set Their Anchor Property to 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;

Надеюсь, что это поможет ..

Для меня было достаточно поставить AnchorStyleNone (не нужно устанавливать налево или что-то еще), мне интересно, если я что-то упустил.
если вы используете этот элемент управления на панели макета таблицы, он может работать. В случае 2 он может работать правильно, если вы установите AnchorStype вNone.
9

TableLayoutPanel вместо:

Put TableLayoutPanel on your form Set dock style Fill to panel Leave only one column inside panel Create row for every button (and put buttons to table cells) Set row size type Autosize Set dock style Fill to every button, except last one Set dock style Top to last button

Кстати, в вашем решении вы должны перебирать элементы управления flowLayoutPanel вместо элементов управления формы. Также рассмотрите вычитание горизонтального поля и отступа из ширины:

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

Но я советую вам использовать TableLayoutPanel вместо этого.

Спасибо за Ваш ответ. +1 David
0

но вы также можете добавить панель в 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);
[email protected](btn);
0

е этот элемент управления сначала в список элементов управления в FlowLayoutPanel1, затем добавьте код ниже.

Пример. Предполагая три существующих метки в FlowLayoutPanel1, результатом должны быть lblEmpty, LabelExisting1 и LabelExisting2 в указанном порядке.

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

Я решил свою проблему, создав этот код.

в вашем случае с кнопками управления, создать4 новые этикетки с.Text=""(empty) и поставить каждый в начале каждой кнопки,naming labels следующим образом: 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

Похожие вопросы