2010-04-16 79 views
6

我正在更新他们的WinForms应用程序用户界面的项目,以更大的一致性。即使使用相同的字体,TextBox和ComboBox控件默认具有不同的高度。我已经能够通过关闭AutoSize来调整文本框的大小,但文本仍然拥抱控件的顶部,并在下面留下空隙。C#WinForms文本框等垂直对齐

有什么办法可以在控件中垂直居中文本吗?

回答

7

如果你在一个控制关闭AutoSize,它必须是一个Label,因为TextBox不具有AutoSize财产。 Label的TextAlign属性属于ContentAligment类型,因此您可以设置水平和垂直对齐方式。

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

在您的用户控件上,将BorderStyle设置为Fixed3D,将BackColor设置为System.Window。添加一个TextBox并将其BorderStyle设置为None。在控件的Resize事件中,添加使TextBox的宽度与用户控件的客户区相同的宽度(占边界像素)并左对齐(即textBox1.Left = 0;)并将其垂直居中(例如textBox1.Top = (this.Height - textBox1.Height)/2;)。

最后,向用户控件添加您需要的任何TextBox类型属性和事件(可能只是Text和TextChanged,我会猜测),并将它们连接起来,以便它们传递到控件中的TextBox,如下所示:

public string Text 
{ 
    get 
    { 
     return textBox1.Text; 
    } 
    set 
    { 
     textBox1.Text = value; 
    } 
} 

如果你想获得超看中这一点,你甚至可以取代你的用户控件的一个,实际上是类型的ContentAlignment(如标签),然后对齐内文本框来匹配TextAlign属性。

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

+5

就像一个参考,实际上TextBoxes上有一个AutoSize属性。它不会显示在属性表中或由于某些属性装饰而自动完成。但myTextBox.AutoSize = false;将编译,并将其放入继承控件的构造函数将导致可调整大小的文本框。 – Clyde 2010-04-16 13:58:05

+1

已注意。自从我停止尝试让Windows控件看起来不同于标准已经有好几年了,所以我有点生疏了。有趣的是,Intellisense说“这个属性与这个类没有关系”,尽管它显然*是*(将它设置为false确实使得高度可调)。 – MusiGenesis 2010-04-16 14:29:56

+0

我想更容易的答案是:切换到WPF。一切都有一个VerticalContentAlignment和一个Horizo​​ntalContentAlignment属性。 – MusiGenesis 2010-04-16 14:33:24

1

晚了一点,但这里简单的答案..

创建一个空的控制,包括你的文本作为一个孩子,那么当父控件或文本框调整重新调整你的文本框控件中间垂直

删除边框,使bk与父母相同(默认)

哦,覆盖字体设置文本框的字体,我认为你有你的valign文本框。

0

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

并禁用添加/删除行,并且您有一个文本框,可以完美地对齐文本。