我需要一种方法来确定多列TextBox
中显示文本的大小,以将Scrollbars
属性设置为正确的值。
由于它是我工作的某种增强型MessageBox
,因此MessageBox
的大小应根据文字的高度和宽度来确定,其中字符串中包含换行符。< / p>
目前,我使用此代码来确定MessageBox
的大小,具体取决于要输入的文本。但是您看到MessageBox
确定了MaximiumSize
。文本本身的TextBox也启用了WordWrap
。因此,唯一未定义的是将文本插入TextBox.Text后的Height
文本。
SizeF textSize = this.tbxText.CreateGraphics().MeasureString(message, this.tbxText.Font);
int frmWidth = picWidth + (int)textSize.Width;
if (frmWidth > this.MaximumSize.Width)
{
frmWidth = this.MaximumSize.Width;
}
else if (frmWidth < this.MinimumSize.Width)
{
frmWidth = this.MinimumSize.Width;
}
int frmHeight = picHeight + (int)textSize.Height + pnlButtons.Height + pnlInput.Height;
if (frmHeight > this.MaximumSize.Height)
{
frmHeight = this.MaximumSize.Height;
}
else if (frmHeight < this.MinimumSize.Height)
{
frmHeight = this.MinimumSize.Height;
}
将TextBox.Scrollbars
属性设置为默认设置允许屏幕上禁用的滚动条不是很好也不想要。
遗憾的是,Graphics.MeasureString
并没有真正帮助,因为它没有考虑WordWrap
行为。
那么,如何确定TextBox.Text
是否离开可见区域需要垂直滚动条呢?
答案 0 :(得分:2)
我会继续使用Graphics.MeasureString
,但您需要添加逻辑,通过将结果字符串宽度除以控件宽度来模拟自动换行(即,您计算文本框宽度如何适合您的字符串宽度)获取你的行然后用它来填充字符串高度。
但请注意,Graphics.MeasureString并不完全准确,但是对于滚动支持的粗略猜测它可能就足够了 - 一如既往地测试它。
答案 1 :(得分:1)
看起来非常简单,使用具有完全不同功能的RichTextBox
,例如Scrollbars
只会在需要时显示,而不会像普通TextBox
那样显示为禁用。
使用RichTextBox
,我可以将ScrollBars
属性设置为两者,然后就可以正确管理。
答案 2 :(得分:1)
某些控件的AutoSize属性会根据内部或文本的控件大小缩小/增长,也许您不需要计算。
答案 3 :(得分:0)
Graphics.MeasureString
重载之一采用width
参数,(字符串的最大宽度,以像素为单位)。
因此,在上面的示例中呈现消息所需的大小可能是:
SizeF textSize = this.tbxText.CreateGraphics()
.MeasureString(message, this.tbxText.Font, this.tbxText.Width);
...
对于其他Graphics.MeasureString
重载,请参阅:MeasureString overloads (MSDN)
答案 4 :(得分:0)
我刚遇到这个问题。我有一个带有文本框的UserControl我想要显示没有滚动条,无论它的大小如何。 (特定的用户控件是窗口中的窗格,窗口可以是纵向或横向,我不希望每个布局都有两个用户控件 - 看起来很愚蠢。)
这个代码在Load事件处理程序中为我做了:
int iLine = textbox1.GetLineFromCharIndex(textbox1.TextLength - 1) + 1;
int iHeight = TextRenderer.MeasureText(this.textbox1.Text, this.textbox1.Font).Height;
float fTextHeight = iHeight * ((float)iLine + 0.25f /* fudge factor */);
textbox1.Size = new Size (textbox1.Size.Width, (int)fTextHeight);
This forum post建议使用TextRenderer.MeasureText()
。