none
关于文字在TextBox中的垂直对齐问题 RRS feed

  • 问题

  • 大家好:

    如上图所示,左侧的TextBox是一个自定义TextBox控件,通过WmPaint和TextRenderer.DrawText实现了默认提示内容的功能,其中TextRenderer.DrawText所使用的TextFormatFlags是TextFormatFlags.VerticalCenter。右侧的TextBox内容是手工输入的,即TextBox.Text里的值。

    现在的问题是,很明显发现两个TextBox的文字在垂直方向是不对齐的,我希望保持水印文字的垂直对齐和TextBox里输入的文字的垂直对齐保持一致,以水印为准。

    我原本的思路是TextBox的TextChanged事件里手工画文本,但是原生的文本绘制还是存在,于是产生的效果就是文字重影:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        using (Graphics graphics = Graphics.FromHwnd(textBox1.Handle))
        {
            TextRenderer.DrawText(graphics, textBox1.Text, Font, textBox1.ClientRectangle, System.Drawing.Color.Red, TextFormatFlags.VerticalCenter);
        }
    }

    我甚至想过先用用TextBox的BackColor绘制一遍TextBox里的文本,再重新自己绘制,但是我发现不管我怎么设置对齐,我都无法覆盖掉原生TextBox里的文本,感觉原生TextBox文本的垂直对齐既不是Top也不是VerticalCenter,不知道是什么。而且我觉得这个思路应该是舍近求远了。

    其次我也尝试过在TextBox里找原生绘制文本的代码打算能够绕过去,但是找了两天没有找到。

    有没有哪位大神可以就这个问题指点一二,或者不吝赐教代码,楼主将不甚感激。(如果是建议完全重写一个TextBox的请留情绕路,我不想为了一个小小的垂直对齐如此大费周章)

    2016年7月21日 3:13

全部回复

  • https://social.msdn.microsoft.com/Forums/zh-CN/10f75954-6d14-4926-a02d-98649653b9c8/watermark-textbox-in-winform?forum=winforms

    参考下这里的


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms


    2016年7月21日 3:59
  • 谢谢回复,但是没有什么帮助。
    2016年7月22日 6:21
  • 你好,

    TextBox控件 没有垂直居中的属性。通常情况下,为了这样的效果,都是通过写自定义的控件来实现的。

    而且,根据你提供的图片来看,你已经做了这样的自定义控件,为什么不直接使用呢?

    Best regards,

    Cole Wu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年7月24日 5:09
    版主
  • Hi,

    谢谢回复。我知道默认的TextBox是没有文本垂直对齐的属性。即使我自己写一个用户控件,里面用的还是原生的TextBox。我不可能把.NET的TextBox控件自己重新写一遍。

    退一步说,我想知道.NET用GDI绘制TextBox的时候是怎么绘制的,在哪一步调用了TextRenderer.DrawText或者Graphics.DrawString,如果知道了,我只要override这一步就可以了。

                    
    2016年7月25日 6:13
  • 请问有人知道怎么解决么?谢谢!
    2016年8月1日 7:52
  • TextBox从微软公开的代码看起来就是不支持居中对齐,因为他是一个简单文本框。

    所以你不妨可以尝试使用RichTextBox,或者直接拷贝你原来那个自定义的文本框控件呢?


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2016年8月4日 0:45
    版主