C# 当AutoSize=false时,垂直对齐文本框中的文本

C# 当AutoSize=false时,垂直对齐文本框中的文本,c#,winforms,winapi,custom-controls,controls,C#,Winforms,Winapi,Custom Controls,Controls,我正在尝试扩展System.Windows.Forms命名空间中的标准TextBox控件。我试图完成的一件事是修改文本框顶部和底部的填充(文本和边框之间的间距) 在左侧/右侧进行操作非常简单,但我很难在顶部/底部进行任何操作 以下是我的几个要求(如果可能): 避免扩展除System.Windows.Forms.TextBox之外的任何内容(无用户控件) 我想保留多行=false 此代码允许我垂直调整大小,并添加了左填充: public class TextBoxTest : TextBox

我正在尝试扩展System.Windows.Forms命名空间中的标准TextBox控件。我试图完成的一件事是修改文本框顶部和底部的填充(文本和边框之间的间距)

在左侧/右侧进行操作非常简单,但我很难在顶部/底部进行任何操作

以下是我的几个要求(如果可能):

  • 避免扩展除System.Windows.Forms.TextBox之外的任何内容(无用户控件)
  • 我想保留
    多行
    =
    false
此代码允许我垂直调整大小,并添加了左填充:

public class TextBoxTest : TextBox
{
    public TextBoxTest()
    {
        base.AutoSize = false;
        NativeMethods.SendMessage(Handle, NativeMethods.EM_SETMARGINS, NativeMethods.EC_LEFTMARGIN, 20);

        base.Height = 55;
        base.Width = 150;
        base.Text = "This is a test";
    }
}
这将看起来像:

我还尝试了
EM_SETRECT
,但它需要一个多行文本框

在不使用UserControl并保持MultiLine=false的情况下,是否可以使用上/下页边距(或垂直居中)

如果是这样,有人能给我指出正确的方向吗

更新,澄清一下,我想从TextBox继承而不是从UserControl或Panel继承的原因是它通过了duck测试(如果它看起来像鸭子,嘎嘎声像鸭子,等等)。我希望
if(myControl是TextBox).
计算为true。也许有一种方法可以做到这一点,我没有做太多的类型转换器,也许这就是我应该走的道路


我希望这是文本框的真正扩展。换句话说,它几乎可以完成文本框所能做的一切,加上一些功能,但由于它不是“textbox”类型,因此没有任何限制。似乎总有办法调整它,它支持左右边距,但似乎不支持上/下边距。再次感谢

您无法从代码中更改Windows窗体文本框的padding属性

相反,您可以在容器中放置文本框,如面板 删除文本框的边框,确保两者的
BackColor
属性相同 将文本框的
Dock
属性更改为
Fill

然后在面板上添加填充。

为什么不将其设置为多行,并防止按enter键?只是一个建议谢谢Ronald,我需要稍微考虑一下,就像当
MultiLine=true
时会发生哪些其他行为差异一样?这对我来说更像是一个修辞性的问题……是的,这也是你必须解决的一件事,只是激发出替代方案。谢谢你的回答,但我想尝试完成的一件事是避免它显示为类型UserControl或Panel。我在我的问题(最后两段)中添加了一个更新来解释为什么我希望它从TextBox继承。。。我的意思是,如果可能的话,它仍然可以做文本框可以做的事情。很明显,这是一个文本框lol。但是它看起来像是有一些垂直的填充。你为什么想要垂直填充呢?