Может ли StatusStrip автоматически изменять высоту в зависимости от размера элементов?

У меня есть строка состояния с несколькими элементами. Одним из них является ToolStripStatusLabel с Spring = True, Когда текст на этикетке слишком длинный, его не видно.

Можно ли сделать так, чтобы строка состояния стала выше и показывать весь текст многострочно?

1 ответ

Решение

Это интересная проблема.... Я попробовал пару вещей, но безуспешно... По сути, ToolStripStatusLabel очень ограничен в возможностях.

В итоге я попытался взломать, что дает желаемый результат, но я не уверен, что даже я бы порекомендовал это, если, конечно, это абсолютно необходимо...

Вот что у меня есть...

В свойствах вашей StatusStrip установите AutoSize = false, чтобы разрешить изменение размера StatusStrip для размещения нескольких строк. Я предполагаю, что statusStrip называется ststusStrip1, содержащий метку с именем toolStripStatusLabel1.

На уровне формы объявите переменную типа TextBox:

  TextBox txtDummy = new TextBox();

При загрузке формы установите некоторые из его свойств:

  txtDummy.Multiline = true;
  txtDummy.WordWrap = true;
  txtDummy.Font = toolStripStatusLabel1.Font;//Same font as Label

Обрабатывать событие рисования toolStripStatusLabel1

 private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e)
 {        

    String textToPaint = toolStripStatusLabel1.Tag.ToString(); //We take the string to print from Tag
    SizeF stringSize = e.Graphics.MeasureString(textToPaint, toolStripStatusLabel1.Font);
    if (stringSize.Width > toolStripStatusLabel1.Width)//If the size is large we need to find out how many lines it will take
    {
        //We use a textBox to find out the number of lines this text should be broken into
        txtDummy.Width = toolStripStatusLabel1.Width - 10;
        txtDummy.Text = textToPaint;
        int linesRequired = txtDummy.GetLineFromCharIndex(textToPaint.Length - 1) + 1;
        statusStrip1.Height =((int)stringSize.Height * linesRequired) + 5;
        toolStripStatusLabel1.Text = "";
        e.Graphics.DrawString(textToPaint, toolStripStatusLabel1.Font, new SolidBrush( toolStripStatusLabel1.ForeColor), new RectangleF( new PointF(0, 0), new SizeF(toolStripStatusLabel1.Width, toolStripStatusLabel1.Height)));
    }
    else
    {
        toolStripStatusLabel1.Text = textToPaint;
    }
} 

IMP: не назначайте свойство text вашей метки, вместо этого поместите его в Tag, мы бы использовали его из Tag

 toolStripStatusLabel1.Tag = "My very long String";

Скриншот

Другие вопросы по тегам