为啥 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 过早地为新行提供空间?的主要内容,如果未能解决你的问题,请参考以下文章