2009-09-24 12 views
8

Framework/C#/Windows FormsFlowLayoutPanel autowrapping nie działa z autoSize

Chciałbym się FlowLayoutPanel aby automatycznie dostosować jego szerokość lub wysokość w zależności od liczby kontroli w jej wnętrzu. Powinien także zmienić liczbę kolumn/wierszy, jeśli nie ma wystarczającej ilości miejsca (zawijaj zawartość). Problem polega na tym, że jeśli ustawię autosize, panel flowlayout nie zawija sterowanych przeze mnie elementów sterujących. Które rozwiązanie jest najlepsze?

Dzięki!

+0

Jestem zaskoczony, nikt nie odpowiedział na ten, mam ten sam problem. Guz? – echo

+1

TableLayoutPanel może być lepszym rozwiązaniem dla Ciebie - ma wbudowaną obsługę automatycznych rozmiarów kolumn i wierszy, a także automatyczny rozmiar dla całego panelu. – Bevan

Odpowiedz

0

Czy dynamicznie dodajesz formanty w oparciu o działania użytkownika? Obawiam się, że będziesz musiał zmienić właściwości FlowLayout w locie w kodzie, dodając do niego nowe elementy sterujące, a następnie odświeżenie formularza powinno wystarczyć.

1

Czy próbowałeś używać TableLayoutPanel? Jest to bardzo przydatne do umieszczania kontrolek w komórkach.

1

Nie ma czegoś takiego jak niemożliwe w rozwoju oprogramowania. Niemożliwe zajmuje więcej czasu.

Zbadałem problem. Jeśli naprawdę istnieje potrzeba Flow Layout, można to zrobić przy odrobinie pracy. Ponieważ FlowLayoutPanel określa elementy sterujące bez szczególnego myślenia o liczbie wierszy/kolumn, ale raczej o łącznej szerokości/wysokości, może być konieczne śledzenie liczby dodanych kontrolek. Przede wszystkim ustaw autosize na wartość false, a następnie prześlij swoją własną logikę zarządzania rozmiarami do zdarzeń ControlAdded/ControlRemoved. Chodzi o to, aby ustawić szerokość i wysokość panelu w taki sposób, że dostaniesz żądaną liczbę „kolumn” nie

Brudny proof of concept:

private void flowLayoutPanel1_ControlAdded(object sender, ControlEventArgs e) 
    { 
     int count = this.flowLayoutPanel1.Controls.Count; 
     if (count % 4 == 0) 
     { 
      this.flowLayoutPanel1.Height = this.flowLayoutPanel1.Height + 70; 
     } 
    } 

jeśli panel ma początkowo szerokość dla 4 kontrolek, wygeneruje wiersz dla nowych. ControlRemoved handler powinien sprawdzić to samo i zmniejszyć wysokość panelu, lub uzyskać wszystkie zawarte kontrolki i umieścić je ponownie. Powinieneś o tym pomyśleć, może to nie jest to, czego chcesz. To zależy od scenariuszy użycia. Czy wszystkie kontrolki będą tego samego rozmiaru? Jeśli nie, potrzebujesz bardziej skomplikowanej logiki.

Ale tak naprawdę, pomyśl o układzie tabeli - możesz zawinąć go w klasę pomocnika lub wyprowadzić z niego nową kontrolę, w której rozwiążesz całą logikę rozmieszczania kontrolek. FlowLayout ułatwia dodawanie i usuwanie kontrolek, ale potem kod zarządzania wielkością idzie. TableLayout daje dobry mechanizm dla wierszy i kolumn, zarządzanie szerokością i wysokością jest łatwiejsze, ale potrzebujesz więcej kodu, aby zmienić rozmieszczenie wszystkich formanty, jeśli chcesz usunąć jeden z formularza dynamicznie.

1

Jeśli to możliwe, sugeruję zmianę rozmiaru obiektu FlowLayoutPanel tak, aby wykorzystywał całą dostępną szerokość, a następnie zakotwiczał go w górnej, lewej i prawej stronie. Powinno to spowodować wzrost wysokości w miarę potrzeby, jednocześnie owijając elementy sterujące.

+1

Ale w jaki sposób można powiedzieć 'FlowLayoutPanel', aby automatycznie aktualizował swoją właściwość' Wysokość' na podstawie liczby linii potrzebnych do utworzenia podczas zawijania zawartości? Podoba mi się pomysł zakotwiczenia Top, Left i Right, ale "Wysokość" mojego "FlowLayoutPanel" wciąż wydaje się być stała ... – binki

2

Ustaw Maksimum rozmiaru FlowLayoutPanel na szerokość, na którą chcesz go zawinąć. Ustaw WrapContents = true.

+0

Ustawienie maksymalnego rozmiaru nadal wymaga obliczenia – Smith