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
属性。 Label
的 TextAlign
属性属于 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 和一个 HorizontalContentAlignment 属性。 我认为这正是他们隐藏属性的原因——如果您无法调整对齐方式,调整高度毫无意义。我现在正在尝试您的解决方案,看看它是否适合我们。 我很确定有一种 Win32-API 消息挂钩方式来垂直对齐文本框,但我找不到它。我认为用户控制方式最终会减少工作量,并且您可以更好地控制最终输出。【参考方案2】:创建一个空的Control
并将您的TextBox
包含为一个孩子。然后当父 Control
或 TextBox
,resize 重新调整你的 TextBox
控件在中间垂直。
移除边框,使背景颜色与父级相同(默认)。覆盖字体以设置TextBox
字体,我认为您将拥有垂直对齐的TextBox
。
【讨论】:
【参考方案3】:一个非常简单的解决方案是使用 Datagridview
与 1 列、1 行、列和行标题不可见并执行 DefaultCellStyle.Alignment = MiddleLeft
。
并禁用添加/删除行,您将拥有一个完美对齐文本的文本框。
【讨论】:
【参考方案4】:您可以简单地调整填充 - 垂直更高。类别布局中的属性。
【讨论】:
不,你不能。 TextBox 控件没有 Padding 属性。【参考方案5】:您是否尝试过TableLayoutPanel
解决方案来提供垂直对齐?然后,您可以根据需要通过事件动态调整高度,或者使用固定值,或者使用TableLayoutPanel
的row 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 控件 文字如何垂直居中?