2010-04-13 9 views

Répondre

3
class AutoFontLabel : Label 
{ 
    public AutoFontLabel() 
     : base() 
    { 
     this.AutoEllipsis = true; 
    } 

    protected override void OnPaddingChanged(EventArgs e) 
    { 
     UpdateFontSize(); 
     base.OnPaddingChanged(e); 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     UpdateFontSize(); 
     base.OnResize(e); 
    } 

    private void UpdateFontSize() 
    { 
     int textHeight = this.ClientRectangle.Height 
      - this.Padding.Top - this.Padding.Bottom; 

     if (textHeight > 0) 
     { 
      this.Font = new Font(this.Font.FontFamily, 
       textHeight, GraphicsUnit.Pixel); 
     } 
    } 
} 

Merci à AMissico qui a mis à jour le contrôle pour gérer le remplissage. Nous pouvons voir comment modifier le Padding et TextAlign sont affectés dans le concepteur.

+0

Pourquoi la multiplication supplémentaire avec 1f? Un casting ne sera-t-il pas plus rapide/plus propre? (Ce n'est pas important) – AMissico

+0

Est-ce que cela provoque un redimensionnement d'étiquette supplémentaire parce que vous changez la police dans OnResize? – AMissico

+0

non, j'ai essayé, ne provoque pas une étiquette supplémentaire resieze; La base OnResieze est définie après. – serhio

0

Je pense que vous devez remplacer la méthode de peinture pour résoudre ce problème et peindre sur votre propre texte. Mais vous devrez utiliser la méthode MeasureString de GDI + pour obtenir la taille du texte, donc la routine qui vous indiquera la taille de police correcte fonctionnera par tâtonnement.

+0

Je pensais plutôt à un truc avec label.OnResize + label.Font = quelque chose – serhio