【问题标题】:C# WinForms Vertical Alignment for TextBox, etcC# WinForms TextBox 等的垂直对齐
【发布时间】:2011-02-08 20:04:48
【问题描述】:

我正在开发一个项目,更新他们的 WinForms 应用程序 UI,使其与尺寸更加一致。默认情况下,TextBox 和 ComboBox 控件具有不同的高度,即使使用相同的字体也是如此。我已经能够通过关闭 AutoSize 来调整文本框的大小,但是文本仍然紧贴控件的顶部,在下方留下了一个空隙。

有没有办法让控件中的文本垂直居中?

【问题讨论】:

    标签: c# winforms alignment


    【解决方案1】:

    如果您在控件上关闭AutoSize,它必须是Label,因为TextBox 没有AutoSize 属性。 LabelTextAlign 属性属于 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 一样处理它。它看起来很奇怪,因为下拉箭头框不会完全位于面板的顶部和底部。

    【讨论】:

    • 仅供参考,实际上在 TextBoxes 上有一个 AutoSize 属性。由于某些属性装饰,它不会显示在属性表中或自动完成。但是 myTextBox.AutoSize = false;将编译,并将其放入继承控件的构造函数中将产生一个可调整大小的文本框。
    • 注明。自从我停止尝试让 Windows 控件看起来与标准不同以来已经有好几年了,所以我有点生疏了。有趣的是,Intellisense 说“此属性与此类无关”,尽管它显然 (将其设置为 false 确实可以调整高度)。
    • 我想更简单的答案是:切换到 WPF。一切都有一个 VerticalContentAlignment 和一个 Horizo​​ntalContentAlignment 属性。
    • 我认为这正是他们隐藏属性的原因——如果您无法调整对齐方式,调整高度毫无意义。我现在正在尝试您的解决方案,看看它是否适合我们。
    • 我很确定有一种 Win32-API 消息挂钩方式来垂直对齐文本框,但我找不到它。我认为用户控制方式最终会减少工作量,并且您可以更好地控制最终输出。
    【解决方案2】:

    创建一个空的Control 并将您的TextBox 包含为一个孩子。然后当父 ControlTextBox,resize 重新调整你的 TextBox 控件在中间垂直。

    移除边框,使背景颜色与父级相同(默认)。覆盖字体以设置TextBox 字体,我认为您将拥有垂直对齐的TextBox

    【讨论】:

      【解决方案3】:

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

      并禁用添加/删除行,您将拥有一个完美对齐文本的文本框。

      【讨论】:

        【解决方案4】:

        您可以简单地调整填充 - 垂直更高。类别布局中的属性。

        【讨论】:

        • 不,你不能。 TextBox 控件没有 Padding 属性。
        【解决方案5】:

        您是否尝试过TableLayoutPanel 解决方案来提供垂直对齐?然后,您可以根据需要通过事件动态调整高度,或者使用固定值,或者使用TableLayoutPanelrow AutoSize 功能。

        只需添加一个TableLayoutPanel 即可包含TextBox。这个TableLayoutContainer 有 1 列和 3 行。 TextBox 必须放在第二行。第一行和最后一行设置为 50% 的高度(它们实际上只使用“剩余高度”)。将TextBox 放置在第二行后,可以将此行设置为您选择的绝对值或自动调整大小。

        TableLayoutPanel 有自己的宽度和高度控制。但是如果你将这个TableLayoutPanel 放在另一个TableLayoutPanel 的单元格中,只需记住将新TableLayoutPanel 的属性Auto-size 设置为true,这样它就可以根据单元格的大小进行调整。

        总的来说,TableLayoutPanels 对您的设计有很大帮助,我绝对推荐使用它们。

        【讨论】:

          猜你喜欢
          • 2018-12-01
          • 2015-12-22
          • 1970-01-01
          • 2016-02-16
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 2012-04-29
          相关资源
          最近更新 更多