如何设置文本框的高度?

4

对于我的单行文本框,我将其边框设置为无。但这样做会使高度变得非常小。我无法以编程方式设置文本框的高度。如果我设置任何边框,那么一切都好了,但我不想要任何边框。甚至文本也无法完全显示 - 所以字体大小已经大于文本框高度。

我尝试创建自定义文本框,并设置其高度,但没有效果。如何处理这种情况?非常感谢您的帮助。


在默认字体大小(Microsoft Sans Serif 8.25 pt)下,这种情况不会发生。但是,如果你增加字体大小,那些低于基线超过几个像素的字形就会被切断。 - Tom Bogle
6个回答

10

有一种简单的方法可以避免创建新类。 在Designer.cs文件中:

this.textBox1.AutoSize = false;
this.textBox1.Size = new System.Drawing.Size(228, 25);

这就是全部。


这并没有问题,除非您理想情况下不希望硬编码所更正的高度,因为您希望它对字体高度(在设计器中)的变化做出适当的响应。实际上在设计器中能够正常工作的自定义控件才是理想的选择,但可能会有点麻烦。 - Tom Bogle

7
TextBox 继承自 Control,后者具有一个名为 AutoSize 的属性,但设计师已将该属性从 PropertyGrid 和 Intellisense 中隐藏,但您仍然可以访问它:
public class TextBoxWithHeight : TextBox {

  public TextBoxWithHeight() {
    base.AutoSize = false;
  }
}

重新构建并使用。


非常感谢。这是可行的解决方案。我将其编写在我的表单代码中并起到了帮助作用。 - Marek Bar

3

TextBox 控件会根据其 Font 的高度自动调整大小,无论您选择的 BorderStyle 是什么。这是 Visual Studio 使用的默认值之一。

通过更改 Multiline,您可以覆盖 Height

this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 
                                             26.25F, 
                                             System.Drawing.FontStyle.Regular, 
                                             System.Drawing.GraphicsUnit.Point,
                                             ((byte)(0)));
this.textBox1.Location = new System.Drawing.Point(373, 502);
// this is what makes the height 'stick'
this.textBox1.Multiline = true;
// the desired height
this.textBox1.Size = new System.Drawing.Size(100, 60);

希望这有所帮助。

谢谢Gustavo。将多行设置为真,并将其高度设置为是一个不错的选择。 - Tvd

2
我刚刚在一个空项目中创建了这个案例,并没有看到你描述的结果。
当BorderStyle为none时,TextBox的显示区域会根据所选字体自动调整大小。如果我将Multiline设置为true,我可以更改Size属性中的高度部分并使更改生效。
也许你代码的其他部分正在修改高度?可能是在调整大小的事件处理程序中?
我的建议:
- 发布代码相关部分 - 尝试在一个空的WinForms项目中重现问题(就像我刚刚做的那样)

我尝试使用空项目进行测试,结果和你说的一样。实际上,这个文本框是一个自定义的文本框,在第四个y处绘制文本,这就是造成差异的原因。谢谢。 - Tvd
3
更改 Multiline 属性会产生副作用,例如禁用自动完成并在文本过长时将最后一个单词包装到下一行。因此,在许多情况下,将 Multiline 设置为 true 是不可接受的。此外,OP 遇到的问题在标准的 TextBox 控件中确实会发生。要重现此问题,请创建一个新的空项目,添加一个文本框,并将其字体设置为“Microsoft Sans Serif, 9.75pt”。将其文本设置为“good day, joe”,并将其 BorderStyle 设置为 None。您将看到 'g'、'y' 和 'j' 都被截断了。 - drwatsoncode
@ricovox:这可能是一般情况,但针对所提出的问题,这个解决方案似乎是合适的,因为OP已经接受了它。 - Eric J.
经过进一步检查,这似乎是TextBox控件绘制文本的一个错误。如果您查看字体大小设置为9.0的标准TextBox控件,则文本上方有4行空白像素,但下方只有一行。您会注意到“g”的底部“钩子”完全被切断了。因此,文本被绘制得太低了。 最好的解决方案由Sereban提供:将TextBox的隐藏AutoSize属性设置为False。然后,您可以将大小设置为任何您想要的大小,而不需要修改Multiline属性。 - drwatsoncode
似乎这是一个定位问题,但并非一定如此。就像一些字形可能有下降线一样,另一些字形则高出基线很多。我认为微软可能实际上弄错了自动调整大小的算法。在11.25 pt时,带有单像素边框的文本框的高度为24个像素。移除边框,高度降至17个像素。这是一个7像素的减少,而只有2(或也许4)像素的变化! - Tom Bogle

0
我认为最好的解决方案是子类化文本框并在那里公开隐藏的AutoSize属性:
public class TextBoxWithHeight : TextBox 
{
    public bool Auto_Size
    {
        get { return this.AutoSize; }
        set { this.AutoSize = value; }
    }
}

现在,您可以使用可视化设计器或代码中的对象检查器打开或关闭自动调整大小。无论您喜欢哪种方式,都可以实现。

-2

只需选择你的文本框并进入属性,然后增加字体大小.. 完成!!!


不行,这样做不起作用。虽然文本框变大了,但文本仍然被剪切。 - Tom Bogle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接