2013-08-19 13 views
5

Prendere un GroupBox, mettere il dire Label all'interno e quindi impostare AutoSizeMode = GrowAndShrink e AutoSize = true.GroupBox autosize

sorgeranno due problemi:

  • C'è un enorme divario tra Label e inferiore del GroupBox (quasi sufficiente per adattarsi a un'altra Label lol);
  • AutoSize non rispetta la proprietà GroupBox.Text.

domanda è come fare GroupBox.AutoSize funziona correttamente? Correttamente significa: la larghezza minima dovrebbe essere sufficiente per adattarsi allo GroupBox.Text, non ci dovrebbero essere spazi vuoti sotto per ragioni sconosciute (non è Margin, né Padding e sembra piuttosto brutto).


Ho cercato di misurare la lunghezza della stringa in OnPaint e l'impostazione MinimumSize proprio lì. Funziona, ma ho dei dubbi a riguardo, come se volessi effettivamente impostare MinimumSize in un secondo momento - sarà perso dopo il ridisegno.


Update, qui è screenshot:

enter image description here

+0

E ', ovviamente, che il 'Località label1' non' Point (0,0) 'è? Non hai nemmeno provato la mia soluzione. –

+0

Sì, ho provato, e non funziona. L'ho detto nella risposta stessa. Desidero pubblicare un altro screenshot in cui 'GroupBox' è compresso (perché nulla impedisce quindi a' AutoSize' di ridurre la dimensione del padre a zero).Dimmi, per favore, cosa dovrei fare ora con questa domanda? Ho un problema, ovvio, non risolto, proveniente da Microsoft, ma la mia domanda è in attesa, quindi nessuno si prenderà mai la briga di rispondere. Ripubblicalo di nuovo? – Sinatr

risposta

1

E 'semplice che la posizione del Label è fissato ad un certo punto diverso (0,0), provate questo:

label1.Location = Point.Empty; 

È potrebbe anche voler provare a impostare il Padding dela 0 per tutti (di default è 3):

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

Non funziona. Impostando questo e poi 'GroupBox.AutoSize = true' si comprime la casella di gruppo per avere 1 pixel di larghezza o qualcosa del genere. Interessante, l'altezza ** del riquadro di gruppo collassato sarà la stessa più grande del necessario (per contenere un altro 'etichetta 'sotto' label1'). In che modo questa risposta suppone di risolvere il secondo problema (con 'GroupBox.Text')? – Sinatr

+0

@Sinatr per favore pubblica la tua schermata. Ho provato con questo e si "riduce" quasi alla dimensione della "etichetta" interna. –

+0

Aggiunto screenshot. – Sinatr

1

Si può sbarazzarsi dello spazio gialla indesiderato in fondo derivando una nuova classe da GroupBox che regola il bordo inferiore un po '. In VB qualcosa di simile ...

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

Sembra come se il controllo GroupBox ha un'imbottitura predefinito di sorta quando cresce il controllo se AutoSize = true. Cioè, una volta che un controllo (all'interno del GroupBox) si trova a 20 pixel circa dal fondo del GroupBox, il GroupBox inizia a crescere. Ciò causa un riempimento di 20 pixel circa dal fondo del controllo più in basso alla parte inferiore del GroupBox (come evidenziato in giallo dall'immagine allegata di @ Sinatr).

Sulla base delle mie osservazioni, il padding sembra essere inferiore quando si coltiva lo Width di GroupBox.

In ogni caso, si può fare qualcosa di simile al seguente "aggirare" il problema:

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