2010-04-13 4 views

ответ

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

Благодаря AMissico, который обновил элемент управления для обработки прокладки. Мы видим, как изменяются настройки Padding и TextAlign в дизайнере.

+0

Почему дополнительное умножение с 1f? Не будет ли бросок быстрее/чище? (Не то, чтобы это важно) – AMissico

+0

Означает ли это изменение размера дополнительной метки, потому что вы меняете шрифт внутри OnResize? – AMissico

+0

нет, я попробовал, не вызывает лишнюю замену ярлыков; базовая OnResieze устанавливается после. – serhio

0

Я думаю, вам нужно будет переопределить метод краски, чтобы решить эту проблему, и нарисуйте свой собственный текст. Но вам нужно будет использовать метод MeasureString для GDI +, чтобы получить размер текста, поэтому процедура, которая скажет вам правильный размер шрифта, будет работать в режиме проб и ошибок.

+0

Я подумал скорее о трюке с меткой. OnResize + label.Font = something – serhio

Смежные вопросы