首页 > 解决方案 > 调整文本框的高度

问题描述

我正在开发一个包含多行文本框的用户控件。

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

所以这里是处理文本的属性:

[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;
}

这次返回的 Width 是正确的,因为它没有超过我通过的那个,但是高度和之前的试验一样。所以它也不起作用。我尝试了不同的组合TextFormatFlags,但无法找到获胜的组合...

这是框架的错误吗?

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

标签: c#winformsautosize

解决方案


TextBox.GetPositionFromCharIndex返回字符的像素位置。此处的位置表示顶部/左侧,因此我们需要再添加一行..

这似乎在这里工作:

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,这有点错误,除非BorderStyleNone。您可以更改为textBox.ClientSize = new Size(textBox.ClientSize.Width, l + lh);


推荐阅读