2013-08-19 4 views
5

Prenez un GroupBox, mettons laissez Label à l'intérieur, puis définissez AutoSizeMode = GrowAndShrink et AutoSize = true.GroupBox autosize

Deux problèmes se posent:

  • Il y a un fossé énorme entre Label et en bas de GroupBox (presque assez pour tenir un autre Label lol);
  • AutoSize ne respecte pas la propriété GroupBox.Text.

La question est comment faire fonctionner correctement GroupBox.AutoSize? Signifie correctement: la largeur minimale devrait être suffisante pour s'adapter GroupBox.Text, il ne devrait y avoir aucun vide ci-dessous pour une raison inconnue (ce n'est pas Margin, ni Padding et il semble très moche).


J'ai essayé de mesurer la longueur de chaîne dans OnPaint et la mise en MinimumSize là. Cela fonctionne, mais j'ai des doutes à ce sujet, comme si je voulais définir MinimumSize plus tard - il sera perdu après repeindre.


mise à jour, voici capture d'écran:

enter image description here

+0

Il est évident que le 'label1' L'emplacement est pas' Point (0,0) '? Vous n'avez même pas essayé ma solution. –

+0

Oui j'ai essayé, et non cela ne fonctionne pas. Je l'ai dit dans la réponse elle-même. Vous voulez que j'envoie une autre capture d'écran où 'GroupBox' est réduit (parce que rien n'empêche' AutoSize' de réduire la taille du parent à zéro).Dites-moi s'il vous plaît, que dois-je faire maintenant avec cette question? J'ai un problème, évident, non résolu, venant de Microsoft, mais ma question est en suspens, donc personne ne prendra la peine d'y répondre. Re-poster à nouveau? – Sinatr

Répondre

1

Il est simple que l'emplacement de votre Label est fixé à un point autre que (0,0), essayez ceci:

label1.Location = Point.Empty; 

Vous peut également vouloir essayer de mettre le Padding de votre GroupBox à 0 pour tous (valeur par défaut est 3):

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

Ne fonctionne pas. Définir cela, puis 'GroupBox.AutoSize = true' va réduire la boîte de groupe pour avoir 1 pixel de largeur ou quelque chose. Assez intéressant, la ** hauteur ** de la boîte de groupe réduite sera plus grande que nécessaire (pour adapter ~ un autre 'Label' sous 'label1'). Comment cette réponse suppose-t-elle de résoudre le second problème (avec 'GroupBox.Text')? – Sinatr

+0

@Sinatr s'il vous plaît poster votre capture d'écran. J'ai essayé avec cela et il «rétrécit» presque à la taille de la «étiquette» intérieure. –

+0

Ajouté screenshot. – Sinatr

1

Vous pouvez vous débarrasser de l'espace jaune indésirable au fond en dérivant une nouvelle classe de GroupBox qui ajuste le bord inférieur un peu. En VB quelque chose comme ...

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

Il semble que le contrôle GroupBox a un rembourrage prédéfini de sortes quand de plus en plus le contrôle si AutoSize = true. C'est-à-dire, une fois qu'un contrôle (à l'intérieur du GroupBox) obtient dans les 20 pixels ou moins du fond de la GroupBox, le GroupBox commence à se développer. Cela provoque un remplissage de 20 pixels environ depuis le bas du contrôle le plus en bas vers le bas de la GroupBox (comme mis en évidence en jaune par l'image ci-jointe @ Sinatr). Sur la base de mes observations, le remplissage semble être moins lors de la croissance du Width du GroupBox.

En tout cas, vous pouvez faire quelque chose comme ce qui suit « contourner » la question:

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