Я работаю над 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
)?