我想创建一个从TextBox继承的控件,它的标签里面“粘贴”到文本框的右侧,哪个文本不是用户可编辑的,而是由属性设置。如何才能做到这一点?我意识到这个用户体验可能有很多原因,但我必须这样做。
答案 0 :(得分:3)
改编自Hans Passant的Button inside a winforms textbox回答:
public class TextBoxWithLabel : TextBox {
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
Label label = new Label();
public TextBoxWithLabel() {
label.BackColor = Color.LightGray;
label.Cursor = Cursors.Default;
label.TextAlign = ContentAlignment.MiddleRight;
this.Controls.Add(label);
}
private int LabelWidth() {
return TextRenderer.MeasureText(label.Text, label.Font).Width;
}
public string LabelText {
get { return label.Text; }
set {
label.Text = value;
SendMessage(this.Handle, 0xd3, (IntPtr)2, (IntPtr)(LabelWidth() << 16));
OnResize(EventArgs.Empty);
}
}
protected override void OnResize(EventArgs e) {
base.OnResize(e);
int labelWidth = LabelWidth();
label.Left = this.ClientSize.Width - labelWidth;
label.Top = (this.ClientSize.Height / 2) - (label.Height / 2);
label.Width = labelWidth;
label.Height = this.ClientSize.Height;
}
}
结果:
答案 1 :(得分:1)
我建议您创建一个UserControl
,TextBox
和Label
靠右。这应该是痛苦少,没有错误。
正如您所说,您已经使用TextBox
来避免重构,您可以将TextBox中使用的所有属性添加为“代理属性”。像这样:
class MyTextBox : UserControl
{
public int TextLength { get { return textbox.TextLength; } }
...
}
这可以帮助您避免太多重构。
答案 2 :(得分:0)
我实际上会创建一个composit控件,或者只是一个UserControl,并将标签和文本框放在一起。然后,您可以删除文本框周围的边框,并使用边框将其环绕,以模仿普通的文本框设计。
最后,我会确保用户控制属性,如Text
映射到文本框,因此很容易将控件用作替换。