You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么WPF TextBox的DesiredHeight会提前为新行预留多余空间?

问题原因

你遇到的提前预留新行高度的问题有两个核心诱因:

  1. 调用Measure方法时传入的约束宽度直接使用了argTextBox.ActualWidth,该宽度是TextBox控件的整体宽度,包含了控件自身的左右边框、内边距(Padding)占用的空间,实际可供文本显示的宽度小于这个值,导致测量时的换行判断和实际渲染的换行逻辑不一致
  2. WPF原生TextBox的测量逻辑默认会将光标(插入符)的宽度纳入计算,当文本输入到行尾时,光标需要占用的宽度会触发测量逻辑提前为下一行预留高度

解决方案

方案1:修正测量参数(推荐)

不要直接测量TextBox控件本身,改为直接计算文本的实际渲染高度,彻底规避控件自带属性的干扰:

// 先计算文本实际可用的显示宽度
double availableWidth = argTextBox.ActualWidth 
    - argTextBox.Padding.Left 
    - argTextBox.Padding.Right 
    - argTextBox.BorderThickness.Left 
    - argTextBox.BorderThickness.Right;

// 用FormattedText直接计算文本高度
var formattedText = new FormattedText(
    argTextBox.Text,
    System.Globalization.CultureInfo.CurrentCulture,
    FlowDirection.LeftToRight,
    new Typeface(
        argTextBox.FontFamily, 
        argTextBox.FontStyle, 
        argTextBox.FontWeight, 
        argTextBox.FontStretch),
    argTextBox.FontSize,
    argTextBox.Foreground,
    VisualTreeHelper.GetDpi(argTextBox).PixelsPerDip);
formattedText.MaxTextWidth = availableWidth;
double actualTextHeight = formattedText.Height;

// 再加上TextBox自身的上下内边距、边框高度得到控件总高度
double controlTotalHeight = actualTextHeight 
    + argTextBox.Padding.Top 
    + argTextBox.Padding.Bottom 
    + argTextBox.BorderThickness.Top 
    + argTextBox.BorderThickness.Bottom;

// 最后设置UserControl高度即可
this.Height = controlTotalHeight;

方案2:优化原有测量逻辑

如果要保留原有测量逻辑,只需要修正传入的约束宽度即可:

double availableWidth = argTextBox.ActualWidth 
    - argTextBox.Padding.Left 
    - argTextBox.Padding.Right 
    - argTextBox.BorderThickness.Left 
    - argTextBox.BorderThickness.Right;
argTextBox.Measure(new Size(availableWidth, Double.PositiveInfinity));
var tempNewSize = argTextBox.DesiredSize;

额外检查项

  • 确认左右两侧的TextBox的TextWrapping、FontSize、FontFamily、Padding等文本相关属性完全一致,避免换行逻辑不同导致的高度偏差
  • 如果不需要手动控制高度,可移除UserControl的硬编码Height设置,将内部布局容器和TextBox的VerticalAlignment设为Top,WPF默认布局系统会自动适配高度

内容的提问来源于stack exchange,提问作者Michiel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:18:00