C# WinForms TextBox 等的垂直对齐

Posted

技术标签:

【中文标题】C# WinForms TextBox 等的垂直对齐【英文标题】:C# WinForms Vertical Alignment for TextBox, etc 【发布时间】:2011-02-08 20:04:48 【问题描述】:

我正在开发一个项目,更新他们的 WinForms 应用程序 UI,使其与尺寸更加一致。默认情况下,TextBox 和 ComboBox 控件具有不同的高度,即使使用相同的字体也是如此。我已经能够通过关闭 AutoSize 来调整文本框的大小,但是文本仍然紧贴控件的顶部,在下方留下了一个空隙。

有没有办法让控件中的文本垂直居中?

【问题讨论】:

【参考方案1】:

如果您在控件上关闭AutoSize,它必须是Label,因为TextBox 没有AutoSize 属性。 LabelTextAlign 属性属于 ContentAligment 类型,因此您可以设置水平和垂直对齐方式。

由于各种无聊的原因,Windows 中的TextBoxes 旨在根据所使用的字体自动调整其高度。要控制文本的高度和垂直居中,您可以快速创建一个自定义UserControl,您可以使用它来替换所有TextBoxes

在您的UserControl 上,将BorderStyle 设置为Fixed3D,将BackColor 设置为System.Window。添加TextBox 并将其BorderStyle 设置为None。在控件的 Resize 事件中,添加代码使TextBox 与用户控件的客户区宽度相同(考虑到边框像素)并将其左对齐(即textBox1.Left = 0;)并垂直居中(例如@ 987654341@).

最后,将您需要的任何TextBox-type 属性和事件添加到用户控件(我猜可能只是 Text 和 TextChanged),并将它们连接起来,以便它们传递到内部的 TextBox你的控制,像这样:

public string Text

    get => textBox1.Text;
    set => textBox1.Text = value;

如果你想用它来获得超棒的效果,你甚至可以将用户控件的 TextAlign 属性替换为实际类型为 ContentAlignment 的属性(如标签),然后对齐内部 TextBox 以匹配.

同样的方法适用于ComboBox,尽管它看起来有点奇怪。使用ComboBox,您将其FlatStyle 属性设置为Flat - 否则您将与TextBox 一样处理它。它看起来很奇怪,因为下拉箭头框不会完全位于面板的顶部和底部。

【讨论】:

仅供参考,实际上在 TextBoxes 上有一个 AutoSize 属性。由于某些属性装饰,它不会显示在属性表中或自动完成。但是 myTextBox.AutoSize = false;将编译,并将其放入继承控件的构造函数中将产生一个可调整大小的文本框。 注明。自从我停止尝试让 Windows 控件看起来与标准不同以来已经有好几年了,所以我有点生疏了。有趣的是,Intellisense 说“此属性与此类无关”,尽管它显然 (将其设置为 false 确实可以调整高度)。 我想更简单的答案是:切换到 WPF。一切都有一个 VerticalContentAlignment 和一个 Horizo​​ntalContentAlignment 属性。 我认为这正是他们隐藏属性的原因——如果您无法调整对齐方式,调整高度毫无意义。我现在正在尝试您的解决方案,看看它是否适合我们。 我很确定有一种 Win32-API 消息挂钩方式来垂直对齐文本框,但我找不到它。我认为用户控制方式最终会减少工作量,并且您可以更好地控制最终输出。【参考方案2】:

创建一个空的Control 并将您的TextBox 包含为一个孩子。然后当父 ControlTextBox,resize 重新调整你的 TextBox 控件在中间垂直。

移除边框,使背景颜色与父级相同(默认)。覆盖字体以设置TextBox 字体,我认为您将拥有垂直对齐的TextBox

【讨论】:

【参考方案3】:

一个非常简单的解决方案是使用 Datagridview 与 1 列、1 行、列和行标题不可见并执行 DefaultCellStyle.Alignment = MiddleLeft

并禁用添加/删除行,您将拥有一个完美对齐文本的文本框。

【讨论】:

【参考方案4】:

您可以简单地调整填充 - 垂直更高。类别布局中的属性。

【讨论】:

不,你不能。 TextBox 控件没有 Padding 属性。【参考方案5】:

您是否尝试过TableLayoutPanel 解决方案来提供垂直对齐?然后,您可以根据需要通过事件动态调整高度,或者使用固定值,或者使用TableLayoutPanelrow AutoSize 功能。

只需添加一个TableLayoutPanel 即可包含TextBox。这个TableLayoutContainer 有 1 列和 3 行。 TextBox 必须放在第二行。第一行和最后一行设置为 50% 的高度(它们实际上只使用“剩余高度”)。将TextBox 放置在第二行后,可以将此行设置为您选择的绝对值或自动调整大小。

TableLayoutPanel 有自己的宽度和高度控制。但是如果你将这个TableLayoutPanel 放在另一个TableLayoutPanel 的单元格中,只需记住将新TableLayoutPanel 的属性Auto-size 设置为true,这样它就可以根据单元格的大小进行调整。

总的来说,TableLayoutPanels 对您的设计有很大帮助,我绝对推荐使用它们。

【讨论】:

以上是关于C# WinForms TextBox 等的垂直对齐的主要内容,如果未能解决你的问题,请参考以下文章

(C#) 从 TextBox WinForms 的删除字符中获取索引

c# winformz中 textbox 控件 文字如何垂直居中?

c# 中怎么调整textbox的文本格式,垂直居中

textbox中的文字如何垂直居中

求c# 控件Textbox 文字垂直居中的方法,自己写控件,没写过,求大神指点详细的?

C# WinForms 面板子定位非常不稳定?