2013-08-19 10 views
5

Nehmen Sie eine GroupBox, setzen Sie sich beispielsweise Label hinein und stellen Sie dann AutoSizeMode = GrowAndShrink und AutoSize = true ein.GroupBox Autosize

Zwei Probleme entstehen:

  • Es gibt eine riesige Lücke zwischen Label und unten GroupBox (fast genug anderen Label lol zu passen);
  • AutoSize respektiert nicht die GroupBox.Text Eigenschaft.

Frage ist wie GroupBox.AutoSize ordnungsgemäß funktioniert zu machen? Richtig bedeutet: minimale Breite sollte genug sein, um GroupBox.Text zu passen, es sollte keine Lücken unterhalb des unbekannten Grundes geben (es ist nicht Margin, noch Padding und es sieht ziemlich hässlich aus).


Ich habe versucht, String-Länge in OnPaint und Einstellung MinimumSize genau dort zu messen. Es funktioniert, aber ich habe Zweifel daran, als ob ich später tatsächlich MinimumSize setzen möchte - es wird nach dem Repaint verloren gehen.


aktualisieren, ist hier Screenshot:

enter image description here

+0

Es ist offensichtlich, dass die 'label1' Lage ist' 'nicht-Punkt (0,0)? Du hast meine Lösung nicht einmal versucht. –

+0

Ja, ich habe es versucht, und nein, es funktioniert nicht. Ich habe das in der Antwort selbst gesagt. Soll ich einen weiteren Screenshot posten, in dem 'GroupBox' minimiert ist (weil nichts verhindern kann, dass' AutoSize' die Größe des Elternteils auf Null reduziert).Sag mir bitte, was soll ich jetzt mit dieser Frage machen? Ich habe ein offensichtliches, ungelöstes Problem, das von Microsoft kommt, aber meine Frage ist in der Warteschleife, also wird sich niemand darum kümmern. Erneut posten? – Sinatr

Antwort

1

Es ist ganz einfach, dass die Lage Ihres Label irgendwann andere als (0,0) festgelegt ist, versuchen Sie dies:

label1.Location = Point.Empty; 

Sie Vielleicht möchten Sie auch versuchen, die Padding Ihrer GroupBox aufzu setzenfür alle (Standard: 3):

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

Funktioniert nicht. Wenn Sie dies und dann "GroupBox.AutoSize = true" einstellen, wird das Gruppenfeld auf 1 Pixel Breite oder etwas verkleinert. Interessant genug, die ** Höhe ** der zusammengefallenen Gruppenbox wird genauso groß wie nötig (um ~ ein weiteres Label unter "Label1" zu passen). Wie soll diese Antwort das zweite Problem beheben (mit 'GroupBox.Text')? – Sinatr

+0

@Sinatr bitte posten Sie Ihren Screenshot. Ich habe es versucht und es "schrumpft" fast auf die Größe des inneren "Labels". –

+0

Screenshot hinzugefügt. – Sinatr

1

Sie der unerwünschten gelben Raum bekommen können am Boden los, indem eine neue Klasse von GroupBox ableiten, dass der untere Rand ein wenig anpasst. In VB so etwas wie ...

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

Es scheint, als ob die GroupBox Kontrolle eine vordefinierte Polsterung der Art hat, wenn die Kontrolle, wenn AutoSize = true wächst. Das heißt, sobald ein Steuerelement (innerhalb der GroupBox) etwa 20 Pixel unterhalb der GroupBox erreicht, beginnt die GroupBox zu wachsen. Dies führt zu einem 20-Pixel-Padding vom unteren Ende des untersten Steuerelements zum unteren Ende der GroupBox (wie gelb durch @ Sinatrs angehängtes Bild hervorgehoben).

Basierend auf meinen Beobachtungen, die Polsterung scheint weniger zu sein, wenn die Width der GroupBox wächst.

Auf jeden Fall können Sie so etwas wie die folgenden „umgehen“ die Frage tun:

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; 
    }