【发布时间】:2011-02-08 20:04:48
【问题描述】:
我正在开发一个项目,更新他们的 WinForms 应用程序 UI,使其与尺寸更加一致。默认情况下,TextBox 和 ComboBox 控件具有不同的高度,即使使用相同的字体也是如此。我已经能够通过关闭 AutoSize 来调整文本框的大小,但是文本仍然紧贴控件的顶部,在下方留下了一个空隙。
有没有办法让控件中的文本垂直居中?
【问题讨论】:
我正在开发一个项目,更新他们的 WinForms 应用程序 UI,使其与尺寸更加一致。默认情况下,TextBox 和 ComboBox 控件具有不同的高度,即使使用相同的字体也是如此。我已经能够通过关闭 AutoSize 来调整文本框的大小,但是文本仍然紧贴控件的顶部,在下方留下了一个空隙。
有没有办法让控件中的文本垂直居中?
【问题讨论】:
如果您在控件上关闭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 一样处理它。它看起来很奇怪,因为下拉箭头框不会完全位于面板的顶部和底部。
【讨论】:
创建一个空的Control 并将您的TextBox 包含为一个孩子。然后当父 Control 或 TextBox,resize 重新调整你的 TextBox 控件在中间垂直。
移除边框,使背景颜色与父级相同(默认)。覆盖字体以设置TextBox 字体,我认为您将拥有垂直对齐的TextBox。
【讨论】:
一个非常简单的解决方案是使用 Datagridview 与 1 列、1 行、列和行标题不可见并执行 DefaultCellStyle.Alignment = MiddleLeft。
并禁用添加/删除行,您将拥有一个完美对齐文本的文本框。
【讨论】:
您可以简单地调整填充 - 垂直更高。类别布局中的属性。
【讨论】:
您是否尝试过TableLayoutPanel 解决方案来提供垂直对齐?然后,您可以根据需要通过事件动态调整高度,或者使用固定值,或者使用TableLayoutPanel 的row AutoSize 功能。
只需添加一个TableLayoutPanel 即可包含TextBox。这个TableLayoutContainer 有 1 列和 3 行。 TextBox 必须放在第二行。第一行和最后一行设置为 50% 的高度(它们实际上只使用“剩余高度”)。将TextBox 放置在第二行后,可以将此行设置为您选择的绝对值或自动调整大小。
TableLayoutPanel 有自己的宽度和高度控制。但是如果你将这个TableLayoutPanel 放在另一个TableLayoutPanel 的单元格中,只需记住将新TableLayoutPanel 的属性Auto-size 设置为true,这样它就可以根据单元格的大小进行调整。
总的来说,TableLayoutPanels 对您的设计有很大帮助,我绝对推荐使用它们。
【讨论】: