我创建了具有某些属性的自定义控件PlaceHolderTextBox。
这是我的代码:
class PlaceHolderTextBox:TextBox
{
public string PlaceHolderText { get; set; }
public Color PlaceHolderColor { get; set; }
public Font PlaceHolderFont { get; set; }
public Color StandardColor { get; set; }
public PlaceHolderTextBox()
{
GotFocus += OnGetFocus;
LostFocus += OnLostFocus;
TextChanged += OnTextChanged;
Text = PlaceHolderText;
ForeColor = PlaceHolderColor;
Font = PlaceHolderFont;
}
private void OnGetFocus(object sender,EventArgs e)
{
if (this.Text == this.PlaceHolderText)
{
ForeColor = StandardColor;
Text = "";
}
}
private void OnLostFocus(object sender, EventArgs e)
{
if (this.Text == "")
{
ForeColor = PlaceHolderColor;
Text = PlaceHolderText;
}
}
}
当我启动程序时,我得到一个空的文本框。
我认为该行为的原因是构造函数按时执行,属性为空,但我不确定。
另外,我想在更改这些自定义属性时进行事件。
有可能吗?
答案 0 :(得分:0)
让我们首先关注您面临的问题。但是请确保您已阅读 注释 。
这是问题所在→在构造函数中,您已将文本设置为PlaceHolderText
属性的值。当时PlaceHolderText
为空。
即使您为构造函数中的Text
属性设置了默认的硬编码值,当您在窗体上放置自定义文本框的实例时,InitializeNewComponent
的{{1}}方法将TextBoxDesigner
属性设置为空字符串。如果关闭并重新打开设计器,将显示您的文本。
注意-为什么不应该通过设置Text属性来显示占位符文本
通过在Text
或Text
事件中设置和重置GotFocus/LostFocus
属性来实现占位符功能绝对不是一个好主意,因为:
要使用占位符(也称为提示,水印和提示横幅),可以使用以下解决方案之一:native text box feature或custom paint solution。