C# WinForms文本框垂直对齐等

7ajki6be  于 2023-08-07  发布在  C#
关注(0)|答案(6)|浏览(377)

我正在做一个项目,更新他们的WinForms应用程序UI,使其与大小更加一致。默认情况下,TextBox和ComboBox控件具有不同的高度,即使使用相同的字体也是如此。我已经能够通过关闭自动调整大小来调整文本框的大小,但文本仍然紧贴控件的顶部,在下面留下一个间隙。
有什么方法可以使文本在控件中垂直居中吗?

zour9fqk

zour9fqk1#

如果您要关闭控件上的AutoSize,则该控件必须是Label,因为TextBox没有AutoSize属性。LabelTextAlign属性的类型为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,如下所示:

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

字符串
如果你想用它来实现超级华丽,你甚至可以用一个实际上是ContentAlignment类型的属性来替换你的用户控件的TextAlign属性(比如Label),然后对齐内部的TextBox来匹配。
同样的方法也适用于ComboBox,尽管它看起来有点奇怪。对于ComboBox,您可以将其FlatStyle属性设置为Flat -否则您将其处理为与TextBox相同。它看起来会很奇怪,因为下拉箭头框不会完全位于面板的顶部和底部。

cgfeq70w

cgfeq70w2#

创建一个空的Control,并将您的TextBox作为子节点包含进来。然后,当父ControlTextBox,调整大小重新调整您的TextBox控件在中间垂直。
删除边框,使背景颜色与父对象相同(默认)。覆盖字体设置TextBox字体,我想你会有一个垂直对齐的TextBox

ctehm74n

ctehm74n3#

一个非常简单的解决方案是使用1列1行的Datagridview,列和行标题不可见,并执行DefaultCellStyle.Alignment = MiddleLeft
并禁用添加/删除行,你有一个文本框,完美地对齐文本。

myss37ts

myss37ts4#

您是否尝试过TableLayoutPanel解决方案来提供垂直对齐?然后,您可以根据需要调整高度,通过事件动态调整,或者使用固定值调整,或者使用TableLayoutPanelrow AutoSize特性调整。
只需添加一个TableLayoutPanel来包含TextBox。这个TableLayoutContainer有1列和3行。TextBox必须放在第二行。第一行和最后一行被设置为50%的高度(它们实际上只使用“剩余高度”)。将TextBox放在第二行后,可以将该行设置为您选择的绝对值或自动调整大小。
TableLayoutPanel有自己的宽度和高度控制。但是,如果您将这个TableLayoutPanel放置在另一个TableLayoutPanel的单元格中,请记住将新TableLayoutPanel的Auto-size属性设置为true,以便它可以根据单元格的大小进行自我调整。
总的来说,TableLayoutPanels对你的设计有很大的帮助,我绝对推荐使用它们。
x1c 0d1x的数据

unhi4e5o

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";

wmvff8tz

wmvff8tz6#

您可以简单地调整填充-垂直更高。属性。

相关问题