如何获取文本框的实际高度?

5

我的第一反应是它会像这样:

int height = textbox.lines.length * lineheight;

但它只计算"\xd\n",而且行可能会被换行。我能得到显示行数或当所有内容都可见时的文本框实际高度(文本内部的高度)吗?


2
winform wpf?什么意思?你知道我们不在你旁边,对吧? - gdoron
Hans Passant,也许部分是这样,但除了这个答案https://dev59.com/qHVD5IYBdhLWcg3wJIAK#4147348之外,那里的所有答案都是错误的,而b8adamson的答案看起来相当冗长和大胆。我希望有一个更好的解决方法 :) - Mike
@gdoron 我认为它是“winform”,因为它在标签中。 - Owais Qureshi
@OwaisQureshi。现在已经有了……它被编辑过了! - gdoron
2个回答

7

我不知道你是否能获得完美的测量结果,但这个方法可以接近:

private int GetTextHeight(TextBox tBox) {
  return TextRenderer.MeasureText(tBox.Text, tBox.Font, tBox.ClientSize,
           TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl).Height;
}

文本框可能有些棘手。如果打开多行功能,如果您按下导致单词换行的字符,那么按退格键不会使其“取消单词换行”,除非我调整文本框大小。这在Win7-64上出现。我认为,文本框控件并不总是这样做。


3
TextFormatFlags.TextBoxControl可以使它看起来不那么古怪。 - Hans Passant
好的,谢谢Lars。我已经从这里制作了一些东西:https://dev59.com/qHVD5IYBdhLWcg3wJIAK#4147348 - Mike
1
太好了!我尝试使用Graphics.MeasureText与行数结合使用(在我的情况下不需要自动换行)。这种方法计算每行略微偏高,因此当有多行时,我的方法看起来很奇怪,有额外的空间。你的方法计算得非常准确!完美!! - awe

0

函数 GetLineFromCharIndex() 可以给你正确的行索引,即使文本被换行。

int lineCount = textBox1.GetLineFromCharIndex(int.MaxValue) + 1;
int lineHeightPixel = TextRenderer.MeasureText("X", textBox1.Font).Height;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接