猿问

调整 TextBox 的高度

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


使用我的控件时,将能够设置将显示的文本。然后 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属性时自动调整高度)?


潇潇雨雨
浏览 455回答 1
1回答

慕的地8271018

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,这有点错误,除非BorderStyle是None。您可以更改为textBox.ClientSize = new Size(textBox.ClientSize.Width, l + lh);
随时随地看视频慕课网APP
我要回答