我在Windows窗体应用程序中创建了一个文本框,该文本框从一个高度开始,用于在一行中输入文本。但是,如果用户输入包含在控件中的文本,我希望文本框自动增加其高度。
目前,对于此文本框,我将属性multiline和wordwrap设置为true。我已经尝试使用TextChanged事件来确定文本何时被包装但我找不到任何可以帮助我的属性。 Lines属性不提供包装文本的任何帮助;仅针对用户点击的文本输入以开始新行。
每次文字换过文本框的宽度时,如何让文本框扩展其高度?
答案 0 :(得分:7)
与其他人发布的想法相同,将其放在textChanged事件中:
Dim s As SizeF = TextRenderer.MeasureText(txt.Text, txt.Font, txt.ClientRectangle.Size, TextFormatFlags.WordBreak)
txt.Height = CInt(s.Height)
您需要某种最小高度,并且可能需要指定一些填充,但这确实有效。
答案 1 :(得分:2)
如果您愿意使用RichTextBox(根据我的经验,这是一种带有许多怪癖的脾气暴躁的控件),您可以使用ContentsResized事件,它会为您提供所需的新大小:< / p>
private void HandleContentsResized(object sender, ContentsResizedEvenetArgs e)
{
int newheight = e.NewRectangle.Height;
}
答案 2 :(得分:2)
我刚刚为不同项目的标签控件编写了这个。我认为代码项目的代码已经到了某个地方。将其更改为文本框应该与更改基础一样简单。
public class GrowLabel : Label
{
private bool _growing;
//public bool GrowFontSize { get; set; }
public GrowLabel()
{
AutoSize = false;
//GrowFontSize = false;
}
public override sealed bool AutoSize
{
get { return base.AutoSize; }
set { base.AutoSize = value; }
}
private void ResizeLabel()
{
if (_growing) return;
try
{
_growing = true;
var sz = new Size(Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.WordBreak);
Height = sz.Height;
}
finally
{
_growing = false;
}
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
ResizeLabel();
}
protected override void OnFontChanged(EventArgs e)
{
base.OnFontChanged(e);
ResizeLabel();
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
ResizeLabel();
}
}
答案 3 :(得分:2)
AdamSane的帖子很有帮助,但文本框没有增长。我要做一些修改。我的mods如下:
class GrowTextBox : TextBox
{
private double m_growIndex = 0.0;
private Timer m_timer;
public GrowTextBox()
{
AutoSize = false;
this.Height = 20;
// Without the timer, I got a lot of AccessViolationException in the System.Windows.Forms.dll.
m_timer = new Timer();
m_timer.Interval = 1;
m_timer.Enabled = false;
m_timer.Tick += new EventHandler(m_timer_Tick);
this.KeyDown += new KeyEventHandler(GrowTextBox_KeyDown);
}
void GrowTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
{
this.SelectAll();
}
}
void m_timer_Tick(object sender, EventArgs e)
{
var sz = new Size(Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.TextBoxControl);
m_growIndex = (double)(sz.Width / (double)Width);
if (m_growIndex > 0)
Multiline = true;
else
Multiline = false;
int tempHeight = (int)(20 * m_growIndex);
if (tempHeight <= 20)
Height = 20;
else
Height = tempHeight;
m_timer.Enabled = false;
}
public override sealed bool AutoSize
{
get { return base.AutoSize; }
set { base.AutoSize = value; }
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
m_timer.Enabled = true;
}
protected override void OnFontChanged(EventArgs e)
{
base.OnFontChanged(e);
m_timer.Enabled = true;
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
m_timer.Enabled = true;
}
}
答案 4 :(得分:1)
我使用下面的代码成功直到第10行,然后它关闭1个字符,但这对我有用。不要问我关于-7和-12之类的随机数,它们与填充有关
private void txbDescription_TextChanged(object sender, EventArgs e)
{
SizeF s = TextRenderer.MeasureText(txbDescription.Text, txbDescription.Font, txbDescription.ClientRectangle.Size, TextFormatFlags.TextBoxControl);
int lines = (int)Math.Ceiling((decimal)Convert.ToInt32(s.Width - 7) / ((decimal)txbDescription.Width - 12));
if (lines == 0)
{
txbDescription.Height = 20;
}
else
{
txbDescription.Height = 20 + (lines - 1) * 13;
}
}
答案 5 :(得分:0)
不幸的是,我无法提供具体信息,但您可能需要进行自定义实施。
我将派生一个新的文本框类型 - ExpandableTextBox - 然后你需要手动实现它。
这似乎与您所寻找的相关:http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/11dfb280-b113-4ddf-ad59-788f78d2995a