Почему текстовое поле WPF desiredHeight слишком рано освобождает место для новой строки?

#c# #wpf #text #textbox #height

Вопрос:

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

Код, который я использую, таков:

  argTextBox.Measure(new Size(argTextBox.ActualWidth, Double.PositiveInfinity));

 var tempNewSize = new Size(argTextBox.DesiredSize.Width, argTextBox.DesiredSize.Height);

 

В котором поле argTextBox равно текстовому полю слева. Каким-то образом высота от tempNewSize уже составляет 47,96 пикселей с одной строкой. С двумя строками я получаю равное количество дополнительного места:
введите описание изображения здесь

Интересно понять, что после того, как я закончил текст слова во второй строке, на символе » x » я уже получаю третью строку по высоте, хотя x все еще визуально располагается на второй строке.

введите описание изображения здесь

Что я делаю не так? В правом текстовом поле нет лишних строк, я также проверил строки во время выполнения, чтобы увидеть, были ли в строке лишние строки.

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

 var tempTextHeight = tempSize.Height;
var tempMargin = 15;

this.Height = tempMargin * 2   tempTextHeight;
 

Удаляя поля, проблема лишних пробелов решается, но слишком скоро не начинается новая строка.

Ответ №1:

Решение для получения новой строки слишком рано заключается в следующем:

При использовании метода измерения маржа не учитывается при расчете, поэтому ее необходимо добавить дополнительно:

  argTextBox.Measure(new Size(argTextBox.ActualWidth   (argTextBox.Margin.Left   argTextBox.Margin.Right), Double.PositiveInfinity));
 

введите описание изображения здесь