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=迈特