Как измерить размер текста в текстбоксе от края первой буквы до края последней?
FormattedText formattedText = new FormattedText(str, CultureInfo.GetCultureInfo("en-us-ru"), FlowDirection.LeftToRight, new Typeface(this.Name_textBox.FontFamily, this.Name_textBox.FontStyle, this.Name_textBox.FontWeight, this.Name_textBox.FontStretch), Name_textBox.FontSize, Brushes.Black);
double width = formattedText.Width;
Этот способ возвращает размер текстбокса, а нужна именно длина текста. Ничего другого не нашел.
Ответ
Решение простое — нужно создать на основе вашего текста геометрию и просто посмотреть ее границы:
var dpiX = 96.0 * VisualTreeHelper.GetDpi(this).DpiScaleX;
var formattedText =
new FormattedText(
MyTextBox.Text,
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface(
MyTextBox.FontFamily,
MyTextBox.FontStyle,
MyTextBox.FontWeight,
MyTextBox.FontStretch),
MyTextBox.FontSize,
Brushes.Black,
dpiX);
var geometry = formattedText.BuildGeometry(new Point());
var bounds = geometry.Bounds;
MessageBox.Show($"{bounds.Width}");
Полный код примера. Разметка:
Кодбихайнд:
private void Button_Click(object sender, RoutedEventArgs e)
{
var dpiX = 96.0 * VisualTreeHelper.GetDpi(this).DpiScaleX;
var formattedText =
new FormattedText(
MyTextBox.Text,
CultureInfo.InvariantCulture,
FlowDirection.LeftToRight,
new Typeface(
MyTextBox.FontFamily,
MyTextBox.FontStyle,
MyTextBox.FontWeight,
MyTextBox.FontStretch),
MyTextBox.FontSize,
Brushes.Black,
dpiX);
var geometry = formattedText.BuildGeometry(new Point());
var bounds = geometry.Bounds;
MyCanvas.Height = formattedText.Height;
MyCanvas.Width = formattedText.Width;
MyPath.Data = geometry;
MyRect.Rect = bounds;
MessageBox.Show($"Ширина форматированного текста: {formattedText.Width}
Ширина границ: {bounds.Width}");
}