Адаптируйте высоту TextBox - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над UserControl, который содержит многострочное TextBox.

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

Итак, вот свойство, которое обрабатывает текст:

[Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
public string TextToDisplay
{
    get
    {
        return internalTextBox.Text;
    }
    set
    {
        internalTextBox.Text = value;
        AdaptTextBoxSize();
    }
}

Моя первая попытка была довольно простой:

private void AdaptTextBoxSize()
{
    int nbLignes = internalTextBox.Lines.Length;
    float lineHeight = internalTextBox.Font.GetHeight();
    internalTextBox.Height = (int)((nbLignes) * lineHeight);
}

Это не сработало, так как не учитывает расстояние между двумя строками текста. Таким образом, чем больше строк в тексте, тем больше меня обрезают.

Итак, я попробовал это:

private void AdaptTextBoxSize()
{
    Size textSize = internalTextBox.GetPreferredSize(new Size(internalTextBox.Width, 0));
    internalTextBox.Height = textSize.Height;
}

Это работает, когда все строки в текстовом поле короче, чем Ширина. Но когда одна строка длиннее и должна быть обрезана до следующей строки, GetPreferredSize() возвращает большую ширину, чем та, которую я пропустил, и поэтому высота слишком мала.

Итак, я снова изменился и попробовал это:

private void AdaptTextBoxSize()
{
    Size textSize = TextRenderer.MeasureText(
                                             internalTextBox.Text, 
                                             internalTextBox.Font, 
                                             new Size(internalTextBox.Width, 0), 
                                             TextFormatFlags.WordEllipsis
                                             );


    internalTextBox.Height = textSize.Height;
}

На этот раз верная ширина верна, так как она не превышает ту, которую я прошел, но высота такая же, как и в предыдущем испытании. Так что это тоже не работает. Я пробовал разные комбинации для TextFormatFlags, но не смог найти выигрышную ...

Это ошибка в фреймворке?

Реальный вопрос здесь в том, есть ли еще что-то, что я могу попробовать, или другое, чтобы добиться того, чего я хочу (то есть, автоматически адаптировать высоту при установке свойства TextToDisplay)?

1 Ответ

0 голосов
/ 04 июля 2018

TextBox.GetPositionFromCharIndex возвращает положение символа в пикселях. Положение здесь означает вверху / влево , поэтому нам нужно добавить еще одну строку ..

Это, кажется, работает здесь:

textBox.Height = textBox.GetPositionFromCharIndex(textBox4.Text.Length - 1).Y + lineHeight;

Я получаю высоту строки следующим образом:

int lineHeight = -1;
using (TextBox t = new TextBox() { Font = textBox.Font }) lineHeight = t.Height;

Я установил Height вместо ClientSize.Height, что немного неверно, если BorderStyle не равно None. Вы можете изменить на textBox.ClientSize = new Size(textBox.ClientSize.Width, l + lh);

...