C# 调整文本框大小以适应内容
我正在编写一个程序,用户应该能够在C# 调整文本框大小以适应内容,c#,winforms,textbox,resize,C#,Winforms,Textbox,Resize,我正在编写一个程序,用户应该能够在文本框中写入文本。我想让文本框自行调整大小,使其适合内容。 我尝试了以下方法: private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e) { System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8); System.Drawing.SizeF mySize
文本框中写入文本。我想让文本框
自行调整大小,使其适合内容。
我尝试了以下方法:
private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
System.Drawing.SizeF mySize = e.Graphics.MeasureString("This is a test", myFont);
this.textBoxTitle.Width = (int)Math.Round(mySize.Width, 0);
}
我得到一个错误,说图形
不适用于textchangedventargs
。是否有其他方法可以调整文本框的大小?您应该尝试以下代码。这对我很有效
private void textBox1_TextChanged(object sender, EventArgs e)
{
Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font);
textBox1.Width = size.Width;
textBox1.Height = size.Height;
}
有关更多信息,请参阅您需要使用表单的CreateGraphics()方法来创建图形实例以测量字符串
TextChangedEventArgs
类没有Graphics
属性,该属性是传递给Paint
事件处理程序的PaintEventArgs
类的属性。请尝试以下操作:
using System.Drawing;
...
private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
// Determine the correct size for the text box based on its text length
// get the current text box safely
TextBox tb = sender as TextBox;
if (tb == null) return;
SizeF stringSize;
// create a graphics object for this form
using(Graphics gfx = this.CreateGraphics())
{
// Get the size given the string and the font
stringSize = gfx.MeasureString(tb.Text, tb.Font);
}
// Resize the textbox
tb.Width = (int)Math.Round(stringSize.Width, 0);
}
基本上,您可以为表单创建自己的图形
对象,然后根据文本框的文本和字体进行测量。使用
的将正确处理图形
对象-您以前的代码将严重泄漏 绑定到错误的事件,并且不能在textchangedventargs
对象中使用图形对象
尝试使用TextChanged事件。以下代码段正在运行:
public Form1()
{
InitializeComponent();
this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
}
void textBox1_TextChanged(object sender, EventArgs e)
{
System.Drawing.SizeF mySize = new System.Drawing.SizeF();
// Use the textbox font
System.Drawing.Font myFont = textBox1.Font;
using (Graphics g = this.CreateGraphics())
{
// Get the size given the string and the font
mySize = g.MeasureString(textBox1.Text, myFont);
}
// Resize the textbox
this.textBox1.Width = (int)Math.Round(mySize.Width, 0);
}
}您是否尝试设置yourTextBox.AutoSize=true代码>?
此属性可能隐藏在GUI设计器中,但您可以在InitializeComponent()之后的表单构造函数中设置它代码>调用。Graphics.Measure字符串您可以执行oPaintEventArgs,而不是在TextChangedEventArgs
我想你想要的是这个
System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
Graphics graphics = this.CreateGraphics();
SizeF textSize = graphics.MeasureString("This is a test", myFont);
问题是,由于没有公共构造函数,您无法通过简单分配来创建Graphics对象,因此最好使用TextRenderer.MeasureText,如中所述
TextRenderer的精确度较低,因为它使用GDI,而Graphics使用GDI+,所以您可能应该在从Width属性获得的值上留一点空白
希望这有助于无论目标是什么
如果文本框的大小应该根据字符串动态设置,而字符串应该是该框中的文本,没有好的选项
原因:MeasureString使用常用的字符串格式化程序作为其自身宽度和高度的分隔符。
也就是说,回车符和换行符也会被解析。产生sizeF.Width和sizeF.Height
根据字符串(及其字体和行数)的不同,这两个变量都可以携带值,这些值有时无法用作文本框的宽度/高度值(因为它们可以大于父窗体的值,这会将文本框的大小调整为某个大小,左边框和下边框超出父窗体的大小)
一些解决方案仍然可用,这取决于人们希望实现的目标
一个想法是:
在designer中创建一个文本框,大小为100 X 100。启用文字换行功能
在文本框的OnTextChanged事件处理程序中,我们只需将文本框的宽度调整为自己定义的值(例如parentform.width或其他硬值)
这将导致换行符重新计算文本框中的字符串,这将重新排列文本框中的所有字符,因为已启用换行符
文本框的高度可以硬设为parentform.height
但是,,
更好:根据方法texbox.GetPositionFromCharIndex(textbox.TextLength-1)返回值(点)的Y值动态设置高度。
然后,使用Math.Min()确定哪个较小(parentform.Height或Point.Y),并将文本框大小重置为新大小(以前确定的宽度,现在确定的高度)
请记住(如果启用了滚动条),在宽度计算中添加大约17个像素
致以最诚挚的问候我正在添加此答案,因为我没有看到在任何其他方面讨论的文本框的固定宽度
方面。如果您的文本框具有固定宽度,并且您只想调整其高度,则可以执行以下操作:
private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
System.Drawing.SizeF mySize = e.Graphics.MeasureString("This is a test", myFont);
this.textBoxTitle.Width = (int)Math.Round(mySize.Width, 0);
}
类似的内容给出了文本的高度,即文本在多行wordwrapped文本框中的绘制方式:
SizeF MessageSize = MyTextBoxControl.CreateGraphics()
.MeasureString(MyTextBoxControl.Text,
MyTextBoxControl.Font,
MyTextBoxControl.Width,
new StringFormat(0));
我不确定StringFormat
应该是什么,但值StringFormatFlags
似乎不适用于默认的TextBox
组合
现在使用MessageSize.Height
可以知道文本框中文本的高度。我遇到了同样的问题,我用一种更简单的方法解决了这个问题
我使用了Label控件的AutoSize属性。我在表单中添加了一个不可见的标签,将其AutoSize属性设置为True。当我需要更改文本框的大小时,我使用以下代码:
MyLabel.Text = MyTextBox.Text;
MyTextBox.Size = MyLabel.Size;
我设置标签的最大和最小大小以获得更好的结果。
玩得开心首先,创建方法使文本框适合其内容
private void AutoSizeTextBox(TextBox txt)
{
const int x_margin = 0;
const int y_margin = 2;
Size size = TextRenderer.MeasureText(txt.Text, txt.Font);
txt.ClientSize =
new Size(size.Width + x_margin, size.Height + y_margin);
}
然后,使用TextChanged事件处理程序调用AutoSizeTextBox()函数,使文本框在文本更改时适合其文本
private void txtContents_TextChanged(object sender, EventArgs e)
{
AutoSizeTextBox(sender as TextBox);
}
仅此而已,有关更多信息:
您是否在silverlight中尝试此操作?我有一个内部有文本框的usercontrol。当文本增长太大时,只有宽度会增加,甚至宽度会超过其父级。如何确定父级的宽度,然后包装文本并增加高度?关于:Graphics g=Graphics.FromHwnd(txtBox.Handle)的情况如何?虽然此链接可以回答问题,但最好在此处包含并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能会无效。Bam!使其与停靠在面板中的文本框一起工作,并且标签的最大大小设置了文本框容器的大小。此外,我还设置了MyLabel.Text=迈特