【发布时间】:2016-05-10 21:56:20
【问题描述】:
我正在创建一个自定义控件(带水印的文本框),它继承自 Textbox。截至目前,文本框在没有文本时正确显示失去焦点的水印,并在文本框获得焦点时将其删除(如果它是水印,它甚至会更改文本的颜色)。 我希望它在显示水印时报告它没有文本,所以我试图覆盖 Text 属性。
代码如下:
public class WatermarkedTextbox : TextBox
{
private bool _isWatermarked;
private string _watermark;
public string Watermark
{
get { return _watermark; }
set { _watermark = value; }
}
[Bindable(false), EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override string Text
{
get
{
return _isWatermarked ? string.Empty : base.Text;
}
set
{
base.Text = value;
}
}
public WatermarkedTextbox()
{
GotFocus += WatermarkedTextbox_GotFocus;
LostFocus += WatermarkedTextbox_LostFocus;
}
private void WatermarkedTextbox_LostFocus(object sender, EventArgs e)
{
if (Text.Length == 0)
{
ForeColor = SystemColors.InactiveCaption;
Text = _watermark;
_isWatermarked = true;
}
}
private void WatermarkedTextbox_GotFocus(object sender, EventArgs e)
{
if (_isWatermarked)
{
ForeColor = SystemColors.ControlText;
Text = string.Empty;
_isWatermarked = false;
}
}
}
问题是,当文本框获得焦点时,它不会删除水印。
我在这里遗漏了什么/做错了什么?
【问题讨论】:
-
你可以创建一个新属性并在 Text override 中设置它的值吗?
-
Winforms 也会调用您覆盖的 Text 属性 getter。用于检查 TextBox 是否需要重新绘制。当它出现时,isWatermarked 字段还没有正确的值。只需将 isWatermarked 赋值移到 文本赋值之前,它就会起作用。
-
Hans Passant,请将此作为答案而不是评论发布,以便我将其标记为解决方案。谢谢你的解释。
标签: c# winforms textbox overriding