2013-03-25 13 views
12

Mam problem z FlowLayoutPanel i nie wiem jak go rozwiązać.Jak uzyskać FlowLayoutPanel.AutoSize do pracy z FlowBreak

Umieszczam dwa FlowLayoutPanels wewnątrz innego; drugi wewnętrzny flp ma 3 przyciski wewnątrz.

enter image description here

Właściwości od FlowLayoutPanel dziecka są:

FlowDirection = LeftToRight; 
AutoSize = true; 
AutoSizeMode = GrowAndShrink; 
WrapContents = true; 

Teraz mogę ustawić dla każdego przycisku właściwość true FlowBreak jednak zachowanie widzę nie jest jeden chcę, chcę FlowLayoutPanel się kurczyć do szerokości przycisków,

enter image description here

Zmiana FlowDirection do UpToDown nie jest opcją.

Ktoś wie, dlaczego funkcja AutoSize nie działa?

to jest kod.

// 
//FlowLayoutPanel1 
// 
this.FlowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 
this.FlowLayoutPanel1.Controls.Add(this.FlowLayoutPanel3); 
this.FlowLayoutPanel1.Location = new System.Drawing.Point(84, 77); 
this.FlowLayoutPanel1.MinimumSize = new System.Drawing.Size(10, 10); 
this.FlowLayoutPanel1.Name = "FlowLayoutPanel1"; 
this.FlowLayoutPanel1.Size = new System.Drawing.Size(308, 265); 
this.FlowLayoutPanel1.TabIndex = 0; 
// 
//FlowLayoutPanel3 
// 
this.FlowLayoutPanel3.AutoSize = true; 
this.FlowLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 
this.FlowLayoutPanel3.Controls.Add(this.Button1); 
this.FlowLayoutPanel3.Controls.Add(this.Button2); 
this.FlowLayoutPanel3.Controls.Add(this.Button3); 
this.FlowLayoutPanel3.Location = new System.Drawing.Point(127, 3); 
this.FlowLayoutPanel3.MinimumSize = new System.Drawing.Size(10, 10); 
this.FlowLayoutPanel3.Name = "FlowLayoutPanel3"; 
this.FlowLayoutPanel3.Size = new System.Drawing.Size(162, 87); 
this.FlowLayoutPanel3.TabIndex = 1; 
// 
//Button1 
// 
this.FlowLayoutPanel3.SetFlowBreak(this.Button1, true); 
this.Button1.Location = new System.Drawing.Point(3, 3); 
this.Button1.Name = "Button1"; 
this.Button1.Size = new System.Drawing.Size(75, 23); 
this.Button1.TabIndex = 0; 
this.Button1.Text = "Button1"; 
this.Button1.UseVisualStyleBackColor = true; 
// 
//Button2 
// 
this.FlowLayoutPanel3.SetFlowBreak(this.Button2, true); 
this.Button2.Location = new System.Drawing.Point(3, 32); 
this.Button2.Name = "Button2"; 
this.Button2.Size = new System.Drawing.Size(75, 23); 
this.Button2.TabIndex = 1; 
this.Button2.Text = "Button2"; 
this.Button2.UseVisualStyleBackColor = true; 
// 
//Button3 
// 
this.Button3.Location = new System.Drawing.Point(3, 61); 
this.Button3.Name = "Button3"; 
this.Button3.Size = new System.Drawing.Size(75, 23); 
this.Button3.TabIndex = 2; 
this.Button3.Text = "Button3"; 
this.Button3.UseVisualStyleBackColor = true; 
+0

to jest problem w moim GUI jedna kontrola https://docs.google.com/document/d/1I6OtboresNk-gfOR3sEM8gyYHVX9sGohdNtX6heeQwI/edit?usp=sharing kiedy kładę 2 kontrole i ustawić FlowBrake do Prawda https://docs.google.com/document/d/17C02PoL8LCyymfXNtEP8N6kkzZETxkiOCb6mPTbzGf0/edit?usp = sharing Chcę, aby kontrolki pozostały w górze, ale ze względu na to, że zmiana szerokości nie pasuje. – Natalia

+0

Czy możesz dodać dwa obrazy - jeden z tym, co masz, a drugi z tym, co próbujesz osiągnąć. Z opisu tekstowego nie jest jasne, z jakim problemem masz do czynienia: –

+0

Dodałem nowy obraz z wynikiem, aw moim poprzednim komentarzu umieściłem dwa linki z zachowaniem na moim GUI – Natalia

Odpowiedz

13

To błąd, już od bardzo dawna. Problem polega na tym, że silnik układu FlowLayoutPanel oblicza błędnie szerokość pierwszego rzędu, w tym szerokość drugiego elementu sterującego, mimo że został on zawinięty do drugiego wiersza.

Sposób obejścia tego problemu jest głupi, ale skuteczny, należy dodać atrapę panelu o szerokości 0 po pierwszym sterowaniu. Jeśli robisz to z projektantem, upuść go najpierw i przeciągnij w odpowiednie miejsce, na prawo od pierwszej kontrolki. Następnie ustaw jego Margin na (0, 0, 0, 0) i Rozmiar na (0, 0) w oknie Właściwości.

+0

Uratowałem mój dzień .. Dziękuję !! – vendettamit

2

Nie rozwiązanie, ale obejście problemu. Wygląda na to, że próbujesz symulować zachowanie TableLayoutPanel, używając przerw przepływu w FlowLayoutPanel. Czy zamiast tego próbowałeś użyć TableLayoutPanel? Zgodnie z twoimi zrzutami ekranu w komentarzach, powinien on działać idealnie dla twoich potrzeb.

+0

W moim gui, użytkownik może ustalić kolejność i pozycję dowolnego przycisku. użytkownik może również przeciągać i upuszczać przycisk do kontenera. jeśli utworzę panel układu tabeli, gdy użytkownik zrezygnuje z kontroli nad tym, zachowanie tabeli nie jest banalne, ponieważ możemy mieć kolumnę kontrolną lub wiersz lub tabelę. – Natalia

+0

@Natalia: czy próbujesz wdrożyć [to] (http://www.devexpress.com/Products/NET/Controls/WinForms/Layout/)? – Neolisk

6

Nie wierzę, że FlowLayoutPanel został zaprojektowany do robienia tego, co próbujesz zrobić. Prawdopodobnie lepiej byłoby użyć TableLayoutPanel. Dodaj TableLayoutPanel z jedną kolumną i dodaj każdy przycisk do wiersza.

Edytuj: Znalazłem hackowską pracę. Po pierwszym przycisku utwórz panel o rozmiarze 0,0 i marginesie 0,0. Upewnij się, że FlowBreak ma wartość false.

enter image description here

Edit: Wystarczy tylko stworzyć jeden panel, po pierwszym przyciskiem, a nie po jednym dla każdego z nich.

+1

Te same myśli, w tym samym czasie. Awans ... :) – Neolisk

+0

@Michael G Spróbuję tego, poczekaj kilka minut ... – Natalia

+1

Twoja "hackowa praca" jest niesamowita. Próbowałem też znaleźć taki, ale kontrola paneli nie przyszła mi do głowy. Żałuję, że nie mogę dać ci kolejnego upominku. – Neolisk

Powiązane problemy