2010-04-16 121 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。

並禁用添加/刪除行,並且您有一個文本框,可以完美地對齊文本。