2013-08-19 9 views
5

Wykonaj GroupBox, powiedzmy Label wewnątrz, a następnie ustaw AutoSizeMode = GrowAndShrink i AutoSize = true.Autosize GroupBox

Dwa problemy pojawią się:

  • Istnieje ogromna różnica między Label iu dołu GroupBox (prawie tyle, aby dopasować inny Label lol);
  • AutoSize nie respektuje właściwości GroupBox.Text.

Pytanie brzmi: jak wykonać GroupBox.AutoSize działa poprawnie? Odpowiednio oznacza: minimalna szerokość powinna być wystarczająca, aby pasowała do GroupBox.Text, nie powinno być żadnych luk poniżej z nieznanego powodu (nie jest to Margin, ani Padding i wygląda dość brzydko).


Próbowałem zmierzyć długość ciągu w OnPaint i ustawienie MinimumSize właśnie tam. Działa, ale mam wątpliwości co do tego, jakbym chciał później ustawić MinimumSize - zostanie utracony po odświeżeniu.


Update, tu jest zrzut ekranu:

enter image description here

+0

jest to oczywiście, że '' nie label1' Lokalizacja Punkt (0,0) 'jest? Nawet nie próbowałeś mojego rozwiązania. –

+0

Tak, próbowałem, i nie, to nie działa. Powiedziałem to w samej odpowiedzi. Chcesz, żebym opublikował kolejny zrzut ekranu, w którym 'GroupBox' jest zwinięty (ponieważ nic nie zapobiega zmniejszeniu rozmiaru elementu nadrzędnego do zera)" AutoSize ").Powiedz mi, proszę, co mam teraz zrobić z tym pytaniem? Mam problem, oczywisty, nierozwiązany, pochodzący od Microsoftu, ale moje pytanie jest zawieszone, więc nikt nigdy nie zadowoli się odpowiedzią na ten temat. Ponownie opublikuj to ponownie? – Sinatr

Odpowiedz

1

To proste, że lokalizacja Twojego Label jest stała w pewnym momencie innym niż (0,0), spróbuj tego:

label1.Location = Point.Empty; 

You może również spróbować ustawić Padding swojego GroupBox na 0 dla wszystkich (domyślnie 3):

groupBox1.Padding = new Padding(0); 
+0

Nie działa. Ustawienie tego, a następnie 'GroupBox.AutoSize = true' spowoduje zwinięcie pola grupy, aby uzyskać szerokość 1 piksela lub coś podobnego. Co ciekawe, ** wysokość ** zwiniętego pola grupowego będzie taka sama, jak potrzeba (aby dopasować ~ jeszcze jedną "Etykietę" pod "etykieta1"). W jaki sposób ta odpowiedź zakłada naprawienie drugiego problemu (z 'GroupBox.Text')? – Sinatr

+0

@Sinatr proszę zamieścić swój zrzut ekranu. Próbowałem z tym i "kurczy się" prawie do rozmiaru wewnętrznej "etykiety". –

+0

Dodano zrzut ekranu. – Sinatr

1

można pozbyć się niechcianego żółtego przestrzeni na dole przez nową klasę wynikające z groupbox która dostosowuje dolnej krawędzi trochę. W VB coś podobnego ...

Public Class BetterGroupBox 
    Inherits GroupBox 

    Public Overrides Function GetPreferredSize(ByVal proposedSize As Size) As Size 
     Dim ns = MyBase.GetPreferredSize(proposedSize) 
     Return New Size(ns.Width, ns.Height - 15) 
    End Function 

End Class 
0

Wydaje się, że kontrola GroupBox ma predefiniowany wyściółkę sortuje gdy rośnie z kontroli, jeśli AutoSize = true. Oznacza to, że gdy formant (wewnątrz GroupBox) znajdzie się w odległości mniejszej niż 20 pikseli dolnej części GroupBox, GroupBox zacznie się powiększać. Powoduje to dopełnienie o 20 pikseli od dołu najniższej kontroli do dolnej części GroupBox (jak zaznaczono na żółto przy dołączonym obrazie @ Sinatr).

Na podstawie moich obserwacji wyściółka wydaje się być mniejsza podczas wzrostu Width w GroupBox.

W każdym razie, można zrobić coś jak następuje „obejść” problem:

public void MyFunction() 
    { 
     groupBox1.AutoSize = true; 

     // Do stuff (e.g., add controls to GroupBox)... 

     // Once all controls have been added to the GroupBox... 
     groupBox1.AutoSize = false; 

     // Add optional padding here if desired. 
     groupBox1.Height = myBottomMostControl.Bottom; 
    } 
Powiązane problemy