7

我有一个文本框,它可以返回长度从 5 个字符到 1000 个字符不等的各种字符串。它具有以下属性:

  • 多行=真
  • 自动换行 = 真

我需要设置文本框的哪些其他属性才能使以下操作成为可能?

  • 盒子的宽度应该是固定的
  • 要根据返回的文本量自动调整框的高度,例如,如果文本运行到 3 行,则它会调整为 3 行的高度。
4

7 回答 7

9

试试下面的代码:

public partial class Form1 : Form
{
     private const int EM_GETLINECOUNT = 0xba;
     [DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
     private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);


     public Form1()
     {
        InitializeComponent();
     }

     private void textBox1_TextChanged(object sender, EventArgs e)
     {
        var numberOfLines = SendMessage(textBox1.Handle.ToInt32(), EM_GETLINECOUNT, 0, 0);
        this.textBox1.Height = (textBox1.Font.Height + 2) * numberOfLines;
     }
} 
于 2012-05-13T21:06:01.543 回答
3

TextBox 类似乎没有内置任何功能来执行此操作,但 Font 类有一个Height属性,该属性返回基线之间的像素数。

还可以找出 TextBox 中的文本占用了多少行,如这篇博文中所述(警告:它并不完全优雅)。

一旦您获得了这些信息,您应该能够使用一些简单的数学方法使 TextChanged 处理程序相应地设置 TextBox 的高度。

于 2012-05-13T20:52:58.713 回答
1

您需要从代码中调整文本框的高度。计算行数(本文可以帮助您做到这一点),然后将 设置为Textbox.Height您需要的值(行数 * 8px 左右,取决于内部使用的字体TextBox)。

在链接文章中的解决方案是重写 TextBox 控件类以获取行数;可能还有其他方法可以获取行数,但文章中建议的解决方案对我来说看起来很优雅。

于 2012-05-13T20:52:35.593 回答
1
private void tb_TextChanged(object sender, EventArgs e)
{
    tb.Height = (tb.Text.Split('\n').Length + 2 ) * tb.Font.Height;
}
于 2013-02-21T10:13:12.343 回答
1

我不敢相信仍然没有真正优雅的方式。这是我不解的:

textBox.Height += textBox.GetPositionFromCharIndex(textBox.Text.Length - 1).Y 
    + 3 + textBox.Font.Height - textBox.ClientSize.Height;

这通过确定文本最后一个字符的像素坐标来工作。

您可以在设置内容后执行此操作,即在OnLoad控件Form或控件OnTextChangedTextBox。如果当用户调整表单大小时固定宽度发生变化,您还应该注意这一点,即OnResizeOnClientSizeChanged.

TextBox支持AutoSize属性。但是,它已true默认设置为,并且不会显示在属性编辑器或 IntelliSense 中。它仅用于字体高度更改,并且在使用时不起作用MultiLine = true:( - 这在文档中没有提到。

其他选项可能包括使用不同的控件,例如RichTextBoxLabel。我还没有尝试过,但似乎Label 支持 AutoSize要好得多。

于 2017-05-10T14:28:43.840 回答
1

在 TextBox 上添加 MaxHeight 属性,如下所示。

<TextBox Name="txtSample" MaxHeight="1000" />

于 2019-10-17T07:00:07.517 回答
0

像这样的东西给出了文本的高度,就像它在文本框本身中的绘制方式一样:

SizeF MessageSize = MyTextBoxControl.CreateGraphics()
                                .MeasureString(MyTextBoxControl.Text,
                                                MyTextBoxControl.Font,
                                                MyTextBoxControl.Width, 
                                                new StringFormat(0));

我不确定StringFormat应该是什么,但这些值StringFormatFlags似乎不适用于默认TextBox化妆。

现在MessageSize.Height您知道文本框中文本的高度。

于 2013-11-29T08:10:16.417 回答