2012-05-15 9 views
12

Mam FlowLayout następująco:Align kontroluje do centrum w FlowLayout

enter image description here

muszę wyśrodkować wszystkie kontrolki na formularzu (Innymi słowy, powiedzmy szerokość formie jest 200. btnOpt1 do btnOpt4 powinien mieć ich Left zaczynając od 100 minus połowy przycisk szerokości nie 0.)

+0

'FLowLayout' nie jest przeznaczony do tego. – SLaks

+0

@SLaks Czy możesz polecić alternatywę? – David

+0

spróbuj użyć panelu – Likurg

Odpowiedz

22

Można to zrobić na dwa sposoby, ale z pewnymi ograniczeniami.

  1. Korzystanie Anchor własność
  2. Korzystanie kontrolę układ z pomocą Docking i Anchor właściwości.

Metoda 1: Kotwica Property

Kontrole są zakotwiczone domyślnie w lewym górnym rogu formularza, który oznacza, gdy rozmiar forma zostanie zmieniona, ich odległość od górnej lewej stronie Formularz pozostanie niezmienny. Po zmianie kotwicy kontrolnej na lewy dolny, kontrolka zachowa ten sam dystans: od dolnej i lewej strony formularza, gdy formularz zmieni rozmiar.

Wyłączenie kotwicy w kierunku spowoduje, że kontrola będzie wyśrodkowana w kierunku w tym kierunku podczas zmiany rozmiaru.

przykład:

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.Korzystanie z formantu układu

  1. Dodaj kontrolę TableLayout, ustaw właściwość Dock jako wypełnienie.
  2. Dodaj 1 wiersz ze stylem Typ rozmiaru Procent 100%
  3. Dodaj kolumnę 3 kolumn (typ rozmiaru - procent (100%)), kolumnę 2 (typ rozmiaru - wartość bezwzględna (200 pikseli)), kolumnę 3 (typ rozmiaru - procent (100) %)).
  4. Teraz Dodaj Panel Control do Column2 i Ustaw jego właściwość Dock, aby Wypełnić
  5. Dodaj Przyciski do tej kontrolki i ustaw ich Rozmiar jak chcesz, i Ustaw Ich Właściwości Kotwicy na AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top

Przykład - fragment kodu Designer.cs formularza.

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; 

Nadzieja to pomaga ..

+0

Dla mnie wystarczyło umieścić AnchorStyle w "None" (nie trzeba ustawiać w lewo ani nic innego), zastanawiam się, czy czegoś brakuje. – Antonio

+1

jeśli używasz tej kontrolki w panelu Układ tabeli, to może działać. W przypadku 2 może być poprawnie działa, jeśli ustawisz AnchorStype na "Brak". –

8

pójdę z TableLayoutPanel zamiast:

  • Put TableLayoutPanel na formularzu
  • styl Zestaw dok Fill do panelu
  • pozostawić tylko jedną kolumnę wewnątrz panelu
  • Tworzenie wiersz dla każdego przycisku (i umieścić przyciski do komórek tabeli)
  • Ustaw typ wielkość rzędu Autosize
  • Set dok styl Fill do każdego przycisku, z wyjątkiem ostatniego jeden
  • Set doku stylu Top na ostatni guzik

BTW w swoim rozwiązaniu należy iterować nad formantami flowLayoutPanel, a nie formantami formularza. Weź również pod uwagę odjęcie marży poziomą i wyściółka z szerokością:

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

Ale radzę używać TableLayoutPanel zamiast.

+0

Dziękuję za odpowiedź. +1 – David

0

Można również użyć układu siatki.

0

nie jestem dobry w C#, ale można też dodać panel w FlowLayoutPanel o tej samej szerokości FlowLayoutPanel. Następnie możesz dodać do panelu utworzony w bieżącym czasie przycisk, który chcesz i ustawić dok na lewo lub prawo. Jak sobie życzysz. Pozwól mi pokazać przykład w VB.NET i C# (stosowanych nawróconych online)

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); 
2

Rozwiązałem to przez zmianę wartości marginesów . Dodaję jednak moją zawartość do panelu.

C#:

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

Utwórz pustą etykietę z name = lblEmpty i autoSize = False. Umieść tę kontrolę najpierw na liście kontrolnej w FlowLayoutPanel1, a następnie dodaj poniższy kod.

Przykład: Zakładając trzy istniejące etykiety w FlowLayoutPanel1, wynikiem powinno być lblEmpty, LabelExisting1 i LabelExisting2, w tej kolejności.

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

Rozwiązałem mój problem, tworząc ten kod.

w swojej skrzynce z przycisków sterujących, tworzenie nowe etykiety z .text = „” (pusty) i umieścić każdy z nich na początku każdego przycisku, nazewnictwa etykiety następująco: lblEmpty1, lblEmpty2, lblEmpty3, lblEmpty4.

następnie dodaj następujący kod:

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 

ten środkowy przycisk, zwiększając szerokość pustej etykiety według szerokości FlowLayoutPanel1