我正在做一个项目,更新他们的WinForms应用程序UI,使其与大小更加一致。默认情况下,TextBox和ComboBox控件具有不同的高度,即使使用相同的字体也是如此。我已经能够通过关闭自动调整大小来调整文本框的大小,但文本仍然紧贴控件的顶部,在下面留下一个间隙。有什么方法可以使文本在控件中垂直居中吗?
zour9fqk1#
如果您要关闭控件上的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;),并将其垂直居中(例如textBox1.Top = (this.Height - textBox1.Height) / 2;)。最后,向用户控件中添加您需要的任何TextBox类型的属性和事件(我猜可能只是Text和TextChanged),并将它们连接起来,以便它们传递到控件中的TextBox,如下所示:
AutoSize
Label
TextBox
TextAlign
ContentAligment
TextBoxes
UserControl
BorderStyle
Fixed3D
BackColor
System.Window
None
textBox1.Left = 0;
textBox1.Top = (this.Height - textBox1.Height) / 2;
TextChanged
public string Text { get => textBox1.Text; set => textBox1.Text = value; }
字符串如果你想用它来实现超级华丽,你甚至可以用一个实际上是ContentAlignment类型的属性来替换你的用户控件的TextAlign属性(比如Label),然后对齐内部的TextBox来匹配。同样的方法也适用于ComboBox,尽管它看起来有点奇怪。对于ComboBox,您可以将其FlatStyle属性设置为Flat -否则您将其处理为与TextBox相同。它看起来会很奇怪,因为下拉箭头框不会完全位于面板的顶部和底部。
ContentAlignment
ComboBox
FlatStyle
cgfeq70w2#
创建一个空的Control,并将您的TextBox作为子节点包含进来。然后,当父Control或TextBox,调整大小重新调整您的TextBox控件在中间垂直。删除边框,使背景颜色与父对象相同(默认)。覆盖字体设置TextBox字体,我想你会有一个垂直对齐的TextBox。
Control
ctehm74n3#
一个非常简单的解决方案是使用1列1行的Datagridview,列和行标题不可见,并执行DefaultCellStyle.Alignment = MiddleLeft。并禁用添加/删除行,你有一个文本框,完美地对齐文本。
Datagridview
DefaultCellStyle.Alignment = MiddleLeft
myss37ts4#
您是否尝试过TableLayoutPanel解决方案来提供垂直对齐?然后,您可以根据需要调整高度,通过事件动态调整,或者使用固定值调整,或者使用TableLayoutPanel的row AutoSize特性调整。只需添加一个TableLayoutPanel来包含TextBox。这个TableLayoutContainer有1列和3行。TextBox必须放在第二行。第一行和最后一行被设置为50%的高度(它们实际上只使用“剩余高度”)。将TextBox放在第二行后,可以将该行设置为您选择的绝对值或自动调整大小。TableLayoutPanel有自己的宽度和高度控制。但是,如果您将这个TableLayoutPanel放置在另一个TableLayoutPanel的单元格中,请记住将新TableLayoutPanel的Auto-size属性设置为true,以便它可以根据单元格的大小进行自我调整。总的来说,TableLayoutPanels对你的设计有很大的帮助,我绝对推荐使用它们。x1c 0d1x的数据
TableLayoutPanel
TableLayoutContainer
TableLayoutPanels
unhi4e5o5#
感谢Boeryepes分享的想法,使用像TextBox这样的Datagridview,我创建了这个。添加Datagridview,设置位置和大小,然后:
private void SetupTextBoxDataGridView(DataGridView dataGridView) { DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn(); dataGridView.Columns.AddRange(column); //dataGridView.Columns[0].Name = "C" + dataGridView.Name; dataGridView.AllowUserToAddRows = false; dataGridView.AllowUserToDeleteRows = false; dataGridView.AllowUserToResizeColumns = false; dataGridView.AllowUserToResizeRows = false; dataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; dataGridView.BackgroundColor = SystemColors.Window; dataGridView.BorderStyle = BorderStyle.Fixed3D; //FixedSingle dataGridView.CellBorderStyle = DataGridViewCellBorderStyle.Single; dataGridView.ColumnHeadersVisible = false; dataGridView.RowHeadersVisible = false; dataGridView.DefaultCellStyle.BackColor = SystemColors.Window; //Window Cell color when in focus or selected dataGridView.DefaultCellStyle.ForeColor = SystemColors.ControlText; dataGridView.DefaultCellStyle.SelectionBackColor = SystemColors.Window; //Window Cell color when not in focus or selected dataGridView.DefaultCellStyle.SelectionForeColor = SystemColors.ControlText; dataGridView.MultiSelect = false; dataGridView.ScrollBars = ScrollBars.None; dataGridView.Rows.Add(""); dataGridView.CellBeginEdit += DataGridView_CellBeginEdit; dataGridView.CellEndEdit += DataGridView_CellEndEdit; //dataGridView.MouseEnter += DataGridView_MouseEnter; } private void DataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { DataGridView control = sender as DataGridView; control.GridColor = SystemColors.Highlight; //Border Color - SystemColors.ControlDark if (!string.IsNullOrEmpty((string)control.Rows[e.RowIndex].Cells[e.ColumnIndex].Value)) { SendKeys.Send("{Right}"); } } private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) { DataGridView control = sender as DataGridView; control.GridColor = SystemColors.ControlDark; //Border Color - SystemColors.ControlDark } //Begin Edit Mode automatically when mouse enter the cell private void DataGridView_MouseEnter(object sender, EventArgs e) { DataGridView control = sender as DataGridView; DataGridViewCell cell = control[control.CurrentCell.ColumnIndex, control.CurrentCell.RowIndex]; if (cell != null && !cell.IsInEditMode && !cell.ReadOnly) { control.BeginEdit(true); } }
字符串使用方法:
public Form1() { InitializeComponent(); SetupTextBoxDataGridView(dataGridView2); }
型使用方法:
//Get text txtNew.Text = (string)dataGridView2.CurrentCell.Value; //Add text dataGridView2.CurrentCell.Value = "Hello"; dataGridView2.Rows[0].Cells[0].Value = "Hello";
型
wmvff8tz6#
您可以简单地调整填充-垂直更高。属性。
6条答案
按热度按时间zour9fqk1#
如果您要关闭控件上的
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;
),并将其垂直居中(例如textBox1.Top = (this.Height - textBox1.Height) / 2;
)。最后,向用户控件中添加您需要的任何
TextBox
类型的属性和事件(我猜可能只是Text和TextChanged
),并将它们连接起来,以便它们传递到控件中的TextBox
,如下所示:字符串
如果你想用它来实现超级华丽,你甚至可以用一个实际上是
ContentAlignment
类型的属性来替换你的用户控件的TextAlign
属性(比如Label),然后对齐内部的TextBox
来匹配。同样的方法也适用于
ComboBox
,尽管它看起来有点奇怪。对于ComboBox
,您可以将其FlatStyle
属性设置为Flat -否则您将其处理为与TextBox
相同。它看起来会很奇怪,因为下拉箭头框不会完全位于面板的顶部和底部。cgfeq70w2#
创建一个空的
Control
,并将您的TextBox
作为子节点包含进来。然后,当父Control
或TextBox
,调整大小重新调整您的TextBox
控件在中间垂直。删除边框,使背景颜色与父对象相同(默认)。覆盖字体设置
TextBox
字体,我想你会有一个垂直对齐的TextBox
。ctehm74n3#
一个非常简单的解决方案是使用1列1行的
Datagridview
,列和行标题不可见,并执行DefaultCellStyle.Alignment = MiddleLeft
。并禁用添加/删除行,你有一个文本框,完美地对齐文本。
myss37ts4#
您是否尝试过
TableLayoutPanel
解决方案来提供垂直对齐?然后,您可以根据需要调整高度,通过事件动态调整,或者使用固定值调整,或者使用TableLayoutPanel
的row AutoSize特性调整。只需添加一个
TableLayoutPanel
来包含TextBox
。这个TableLayoutContainer
有1列和3行。TextBox
必须放在第二行。第一行和最后一行被设置为50%的高度(它们实际上只使用“剩余高度”)。将TextBox
放在第二行后,可以将该行设置为您选择的绝对值或自动调整大小。TableLayoutPanel
有自己的宽度和高度控制。但是,如果您将这个TableLayoutPanel
放置在另一个TableLayoutPanel
的单元格中,请记住将新TableLayoutPanel
的Auto-size属性设置为true,以便它可以根据单元格的大小进行自我调整。总的来说,
TableLayoutPanels
对你的设计有很大的帮助,我绝对推荐使用它们。x1c 0d1x的数据
unhi4e5o5#
感谢Boeryepes分享的想法,使用像TextBox这样的Datagridview,我创建了这个。添加Datagridview,设置位置和大小,然后:
字符串
使用方法:
型
使用方法:
型
wmvff8tz6#
您可以简单地调整填充-垂直更高。属性。