可扩展的WinForms文本框(Expandable WinForms TextBox)

2019-09-21 10:51发布

我创建的,在为单行输入文本的高度开始了Windows窗体应用程序中的文本。 不过,我想文本框如果用户输入的是在控制之内换行文本自动增加它的高度。

目前,该文本框,我有性质多和换行设置为true。 我已经使用TextChanged事件,以确定该文本已换,但我无法找到任何财产,这将帮助我试过。 行酒店不提供换行文本的任何帮助; 仅针对用户已按回车键开始新的一行文字。

我怎样才能让我的每一个文本框文字环绕过去的文本框的宽度时扩大其高度?

Answer 1:

同样的想法,正如其他人发布的,把这个在您的TextChanged事件:

Dim s As SizeF = TextRenderer.MeasureText(txt.Text, txt.Font, txt.ClientRectangle.Size, TextFormatFlags.WordBreak)
txt.Height = CInt(s.Height)

您将需要某种形式的最低高度,并有可能指定一些填充,但这样做的工作。



Answer 2:

如果你愿意使用一个RichTextBox,而不是(在我的经验,是那种带有很多怪癖的脾气暴躁控制的),你可以使用ContentsResized事件,它给你所需的新的大小:

private void HandleContentsResized(object sender, ContentsResizedEvenetArgs e)
{
    int newheight = e.NewRectangle.Height;
}


Answer 3:

我只写了这个针对不同的项目一个标签控件。 我得到了代码从代码项目的地方,我认为。 它更改为一个文本框应尽可能改变基一样简单。

public class GrowLabel : Label
{
    private bool _growing;
    //public bool GrowFontSize { get; set; }

    public GrowLabel()
    {
        AutoSize = false;
        //GrowFontSize = false;
    }

    public override sealed bool AutoSize
    {
        get { return base.AutoSize; }
        set { base.AutoSize = value; }
    }

    private void ResizeLabel()
    {
        if (_growing) return;
        try
        {
            _growing = true;

            var sz = new Size(Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.WordBreak);
            Height = sz.Height;
        }
        finally
        {
            _growing = false;
        }
    }

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        ResizeLabel();
    }

    protected override void OnFontChanged(EventArgs e)
    {
        base.OnFontChanged(e);
        ResizeLabel();
    }

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        ResizeLabel();
    }
}


Answer 4:

AdamSane的职位是有益的,但文本框没有增长。 我倒是做了一些修改。 我的MODS低于:

class GrowTextBox : TextBox
{
    private double m_growIndex = 0.0;
    private Timer m_timer;

    public GrowTextBox()
    {
        AutoSize = false;
        this.Height = 20;

        // Without the timer, I got a lot of AccessViolationException in the System.Windows.Forms.dll.
        m_timer = new Timer();
        m_timer.Interval = 1;
        m_timer.Enabled = false;
        m_timer.Tick += new EventHandler(m_timer_Tick);

        this.KeyDown += new KeyEventHandler(GrowTextBox_KeyDown);
    }

    void GrowTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
        {
            this.SelectAll();
        }
    }

    void m_timer_Tick(object sender, EventArgs e)
    {
        var sz = new Size(Width, Int32.MaxValue);
        sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.TextBoxControl);

        m_growIndex = (double)(sz.Width / (double)Width);

        if (m_growIndex > 0)
            Multiline = true;
        else
            Multiline = false;

        int tempHeight = (int)(20 * m_growIndex);

        if (tempHeight <= 20)
            Height = 20;
        else
            Height = tempHeight;

        m_timer.Enabled = false;
    }

    public override sealed bool AutoSize
    {
        get { return base.AutoSize; }
        set { base.AutoSize = value; }
    }


    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        m_timer.Enabled = true;
    }

    protected override void OnFontChanged(EventArgs e)
    {
        base.OnFontChanged(e);
        m_timer.Enabled = true;
    }

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        m_timer.Enabled = true;
    }
}


Answer 5:

我使用下面的成功代码,直到大约10日线,那么它得到1个字符了,但是这对我的作品。 不要问我关于随机号码,如 - 7 - 12,他们有事情做了填充

    private void txbDescription_TextChanged(object sender, EventArgs e)
    {
        SizeF s = TextRenderer.MeasureText(txbDescription.Text, txbDescription.Font, txbDescription.ClientRectangle.Size, TextFormatFlags.TextBoxControl);

        int lines = (int)Math.Ceiling((decimal)Convert.ToInt32(s.Width - 7) / ((decimal)txbDescription.Width - 12));

        if (lines == 0)
        {
            txbDescription.Height = 20;
        }
        else
        {
            txbDescription.Height = 20 + (lines - 1) * 13;
        }
    }


Answer 6:

不幸的是,我不能提供细节,但你将需要大概做一个自定义实现。

我会得到一个新的文本框中键入 - ExpandableTextBox - 然后你需要手工来实现它。

这也似乎与您无关,在找什么: http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/11dfb280-b113-4ddf-ad59-788f78d2995a



文章来源: Expandable WinForms TextBox