C# 调整文本框的高度

C# 调整文本框的高度,c#,winforms,autosize,C#,Winforms,Autosize,我正在处理一个包含多行文本框的UserControl 使用我的控件时,可以设置将显示的文本。然后文本框应调整其高度以使文本适合,宽度不能更改 下面是处理文本的属性: [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))] public string TextToDisplay { get { return internalTextBox.Text; } set {

我正在处理一个包含多行文本框的UserControl

使用我的控件时,可以设置将显示的文本。然后文本框应调整其高度以使文本适合,宽度不能更改

下面是处理文本的属性:

[Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
public string TextToDisplay
{
    get
    {
        return internalTextBox.Text;
    }
    set
    {
        internalTextBox.Text = value;
        AdaptTextBoxSize();
    }
}
我的第一次尝试相当简单:

private void AdaptTextBoxSize()
{
    int nbLignes = internalTextBox.Lines.Length;
    float lineHeight = internalTextBox.Font.GetHeight();
    internalTextBox.Height = (int)((nbLignes) * lineHeight);
}
这不起作用,因为它没有考虑两行文本之间的间距。因此,文本中的行越多,我被剪的越短

所以我试了一下:

private void AdaptTextBoxSize()
{
    Size textSize = internalTextBox.GetPreferredSize(new Size(internalTextBox.Width, 0));
    internalTextBox.Height = textSize.Height;
}
当文本框中的所有行都短于宽度时,此选项将起作用。但是,当一行较长并且应该剪切到下一行时,
GetPreferredSize()
返回的宽度比我传递的宽度大,因此高度太小

所以我又换了一次,试了这个:

private void AdaptTextBoxSize()
{
    Size textSize = TextRenderer.MeasureText(
                                             internalTextBox.Text, 
                                             internalTextBox.Font, 
                                             new Size(internalTextBox.Width, 0), 
                                             TextFormatFlags.WordEllipsis
                                             );


    internalTextBox.Height = textSize.Height;
}
这次返回的宽度是正确的,因为它没有超过我通过的宽度,但高度与上一次试验相同。所以它也不起作用。我尝试了
TextFormatFlags
的不同组合,但未能找到获胜的组合

这是来自框架的bug吗

这里真正的问题是,我是否可以尝试其他方法,或者其他方法来实现我想要的(即,在设置
TextToDisplay
属性时自动调整高度)?

返回字符的像素位置。此处的位置表示上/左,因此我们需要再添加一行

这似乎在这里起作用:

textBox.Height = textBox.GetPositionFromCharIndex(textBox4.Text.Length - 1).Y + lineHeight;
我得到的线条高度如下:

int lineHeight = -1;
using (TextBox t = new TextBox() { Font = textBox.Font }) lineHeight = t.Height;

我设置了
Height
而不是
ClientSize.Height
,这有点错误,除非
BorderStyle
None
。您可以更改为
textBox.ClientSize=新大小(textBox.ClientSize.Width,l+lh)

属性的值是多少?可能有关系。@AhmedAbdelhameed我尝试了你链接中的解决方案,但仍然有相同的问题。这些值稍有不同,但如果我的一行太长,我仍然有一行被剪掉。为什么要使用
TextFormatFlags.wordellission
?尝试测量文本是正确的方法(无需对整个故事提出质疑),它应该有效。我建议您只发布带有测量文本尝试的代码和有问题的屏幕截图。“高度与前一次试验相同”可能是一个有趣的观察结果,但并非真正有用。宽度存在已知问题:。尝试使用
TextFormatFlags.WordBreak
(from),结果不同吗?@Sinatr我实际上测量宽度没有问题,但测量高度有问题。我的宽度是固定的,但当一条线太长时,计算的高度似乎不正确。我会更新我的问题