WPF中测量TextBox返回零尺寸:如何不显示获取其高度?
WPF TextBox 未显示时获取高度的问题
问题场景
尝试通过Measure方法计算TextBox高度时,返回的DesiredSize高度为0,但同样的代码对TextBlock有效:
public partial class MainWindow : Window { public MainWindow() { var block = new TextBlock(); block.Measure(new Size(100, 100)); Console.WriteLine(block.DesiredSize); // {0,15.96} 正常返回高度 var box = new TextBox(); box.Measure(new Size(100, 100)); Console.WriteLine(box.DesiredSize); // {0,0} 高度为0,原因是什么? } }
原因分析
TextBox的高度计算依赖其内部模板控件(如ScrollViewer、文本宿主)的布局,当TextBox未添加到可视化树且未手动应用模板时,这些内部控件尚未初始化,导致Measure无法正确计算所需尺寸。此外,空TextBox的默认布局逻辑可能不会触发高度计算。
解决方案
无需实际显示TextBox即可获取正确高度,可采用以下方法:
方法1:手动应用模板
调用ApplyTemplate()强制加载TextBox的模板,确保内部控件初始化后再执行Measure:var box = new TextBox(); box.ApplyTemplate(); // 手动触发模板加载 box.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); // 让控件计算自身所需最大高度 Console.WriteLine(box.DesiredSize); // 正常返回默认高度方法2:设置文本内容
给TextBox设置至少一个字符(比如空格),触发内部布局逻辑:var box = new TextBox(); box.Text = " "; // 用空字符触发布局计算 box.Measure(new Size(100, double.PositiveInfinity)); Console.WriteLine(box.DesiredSize); // 返回正确高度方法3:读取默认属性值
如果只需要默认高度参考,可直接读取TextBox的MinHeight属性:var box = new TextBox(); Console.WriteLine(box.MinHeight); // 获取控件默认最小高度
内容的提问来源于stack exchange,提问作者tpol
相关产品推荐
相关产品推荐

