我正在尝试扩展 TextBox 以在其左侧添加一个标签并将其视为一个控件,这样我就不必跟踪它们的大小、位置等。
我创建了一个扩展 Control 并具有 TextBox 和 Label 字段的 TextBoxWithLabel 类,但我不太确定要对 onPaint() 做什么 - 我是否必须告诉它手动绘制这两个项目?如果是这样,怎么办?我猜默认的继承行为不会达到“检查我是否包含任何子控件,如果包含,则绘制它们”......
这是最好的方法吗?我之前让我的类扩展了 TextBox 并只添加了 Label 字段,但当然它没有添加到包含 TextBoxWithLabel 的面板中,因此没有绘制。
任何建议或正确的方向表示赞赏。
Thanks,
Alex
这里的典型方法是在 UserControl 中放置标签和文本框。但这很痛苦,您必须将文本框的许多属性和事件添加到用户控件,以便它至少类似于文本框。丑陋的样板代码。
另一种方法是创建一个自定义文本框,将其隐藏在父级的标签控件中。这完全像一个文本框,无需做任何工作。将新类添加到您的项目中并粘贴下面所示的代码。编译。将新控件从工具箱顶部拖放到窗体上。将“描述”属性设置为您希望在标签中看到的文本。
using System;
using System.Drawing;
using System.Windows.Forms;
class MyTextBox : TextBox {
private Label label;
public MyTextBox() {
label = new Label();
label.AutoSize = true;
label.Font = this.Font;
label.Location = this.Location;
label.Resize += new EventHandler(label_Resize);
}
protected override void OnParentChanged(EventArgs e) {
// Keeps label on the same parent as the text box
base.OnParentChanged(e);
label.Parent = this.Parent; // NOTE: no dispose necessary
}
private void moveLabel() {
// Keep label right-aligned to the left of the text box
label.Location = new Point(this.Left - label.Width - 10, this.Top);
}
private void label_Resize(object sender, EventArgs e) {
moveLabel();
}
protected override void OnLocationChanged(EventArgs e) {
base.OnLocationChanged(e);
moveLabel();
}
public string Description {
get { return label.Text; }
set { label.Text = value; }
}
public override Font Font {
get { return base.Font; }
set { base.Font = label.Font = value; }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)