为啥 WPF 文本框 DesiredHeight 过早地为新行提供空间?

Posted

技术标签:

【中文标题】为啥 WPF 文本框 DesiredHeight 过早地为新行提供空间?【英文标题】:Why does a WPF Textbox DesiredHeight gives space for a new line too soon?为什么 WPF 文本框 DesiredHeight 过早地为新行提供空间? 【发布时间】:2021-11-22 07:19:47 【问题描述】:

我在左侧的 UserControl 中有一个 TextBox,其中填充了来自右侧 TextBox 的文本。这个想法是我在右侧键入的任何文本,在左侧可见,并且 UserControl 的高度取决于写入的文本量:

我使用的代码是:

 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));

【讨论】:

以上是关于为啥 WPF 文本框 DesiredHeight 过早地为新行提供空间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 WPF 转换器“错过”文本框中的最后一个字符?

为啥在 tabcontrol 内的 WPF 文本框中单击时,Windows 10 键盘会出现并立即消失?

MVVM WPF:为啥在运行应用程序时更新文本框中的文本后模型中的属性始终为空?

C#软件中WPF 里面使用 [文本框].Text 中的Text不能使用了,为啥?

为啥我的组合框无法绑定到 ViewModel 中的 List<string>? WPF

wpf 文本框问题