我有一个文本框,它可以返回长度从 5 个字符到 1000 个字符不等的各种字符串。它具有以下属性:
- 多行=真
- 自动换行 = 真
我需要设置文本框的哪些其他属性才能使以下操作成为可能?
- 盒子的宽度应该是固定的
- 要根据返回的文本量自动调整框的高度,例如,如果文本运行到 3 行,则它会调整为 3 行的高度。
试试下面的代码:
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;
}
}
您需要从代码中调整文本框的高度。计算行数(本文可以帮助您做到这一点),然后将 设置为Textbox.Height
您需要的值(行数 * 8px 左右,取决于内部使用的字体TextBox
)。
在链接文章中的解决方案是重写 TextBox 控件类以获取行数;可能还有其他方法可以获取行数,但文章中建议的解决方案对我来说看起来很优雅。
private void tb_TextChanged(object sender, EventArgs e)
{
tb.Height = (tb.Text.Split('\n').Length + 2 ) * tb.Font.Height;
}
我不敢相信仍然没有真正优雅的方式。这是我不解的:
textBox.Height += textBox.GetPositionFromCharIndex(textBox.Text.Length - 1).Y
+ 3 + textBox.Font.Height - textBox.ClientSize.Height;
这通过确定文本最后一个字符的像素坐标来工作。
您可以在设置内容后执行此操作,即在OnLoad
控件Form
或控件OnTextChanged
中TextBox
。如果当用户调整表单大小时固定宽度发生变化,您还应该注意这一点,即OnResize
或OnClientSizeChanged
.
TextBox
支持AutoSize
属性。但是,它已true
默认设置为,并且不会显示在属性编辑器或 IntelliSense 中。它仅用于字体高度更改,并且在使用时不起作用MultiLine = true
:( - 这在文档中没有提到。
其他选项可能包括使用不同的控件,例如RichTextBox
或Label
。我还没有尝试过,但似乎Label 支持 AutoSize要好得多。
在 TextBox 上添加 MaxHeight 属性,如下所示。
<TextBox Name="txtSample" MaxHeight="1000" />
像这样的东西给出了文本的高度,就像它在文本框本身中的绘制方式一样:
SizeF MessageSize = MyTextBoxControl.CreateGraphics()
.MeasureString(MyTextBoxControl.Text,
MyTextBoxControl.Font,
MyTextBoxControl.Width,
new StringFormat(0));
我不确定StringFormat
应该是什么,但这些值StringFormatFlags
似乎不适用于默认TextBox
化妆。
现在MessageSize.Height
您知道文本框中文本的高度。