【问题标题】:How-To set Height of a Textbox?如何设置文本框的高度?
【发布时间】:2011-07-15 17:37:13
【问题描述】:

对于我的单行文本框,我设置为 Border = None。这样做时,高度变得非常小。我无法以编程方式设置文本框的高度。如果我设置任何边框,那么它也很好,但我不想要任何边框。甚至文本也不完全可见 - 因此字体大小已经大于文本框高度。

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

【问题讨论】:

  • 在默认字体大小(Microsoft Sans Serif 8.25 pt)下不会发生这种情况。但是,如果您增加字体大小,低于基线超过几个像素的字形会被截断。

标签: c# winforms


【解决方案1】:

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

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

仅此而已。

【讨论】:

  • 这很好,但理想情况下您并不想硬编码校正后的高度,因为您希望它对字体高度的变化做出适当的响应(在 Designer 中)。一个在 Designer 中实际正常工作的自定义控件是理想的,虽然有点痛苦。
【解决方案2】:

TextBox 派生自 Control,它具有 AutoSize 属性,但设计人员已将属性隐藏在 PropertyGrid 和 Intellisense 中,但您仍然可以访问它:

public class TextBoxWithHeight : TextBox {

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

重建和使用。

【讨论】:

  • 非常感谢。这是有效的解决方案。我用我的表单代码编写并提供了帮助。
【解决方案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);

希望这会有所帮助。

【讨论】:

  • 感谢古斯塔沃。将多行设为 True 然后设置高度也是一个不错的选择。
【解决方案4】:

我刚刚在一个空项目中创建了这个案例,没有看到您描述的结果。

当 BorderStyle 为 none 时,文本框的显示区域会自动调整为所选字体的大小。如果我然后设置 Multiline = true,我可以更改 Size 属性的高度部分并且更改棒。

也许您的代码的另一部分正在修改高度?可能是调整大小事件处理程序?

我的建议:

  • 发布代码的相关部分
  • 尝试在一个空的 WinForms 项目中重现该问题(就像我刚才所做的那样)

【讨论】:

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

我发现最好的解决方案是子类化文本框并在那里公开隐藏的 AutoSize:

public class TextBoxWithHeight : TextBox 
{
    public bool Auto_Size
    {
        get { return this.AutoSize; }
        set { this.AutoSize = value; }
    }
}

现在您可以使用可视化设计器或代码中的对象检查器打开或关闭 Autosize,无论您喜欢什么。

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 不,这不起作用。它使文本框变大,但文本仍然被剪裁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多