我开始学习C#了。我精通php和其他网络相关语言。我开始创建一个登录窗口,我想要做的第一件事就是创建一个可以有占位符的文本框。
我假设我必须创建一个新类,它是TextBox的扩展,下面的所有内容似乎都可以正常工作,除非我使用设计器编辑或移动其中一个文本框,它会向InitializeComponent添加一行()部分指定文本应该是什么颜色,并且(自然地)覆盖我的新类设置它的任何内容,现在它是可以的,因为它与我想要的颜色相同。但是,如果我想使用我的类更改所有占位符文本框的颜色,它添加的那一行将只保留特定的框旧颜色,这似乎完全违背面向对象编程的想法,因为现在我必须手动返回并更改InitializeComponent()部分中的所有文本框而不仅仅是类,所以我知道我一定做错了。
这是我的新班级,忽略我做过的任何其他不会影响我的问题的奇怪事情,除非你也想帮助它,但就像我说我刚开始学习(昨天实际上),我的SelectionStart和长度不起作用,但我没有那么远,看看是怎么回事。
class PlaceHolderTextBox : System.Windows.Forms.TextBox
{
private string defaultText;
public bool isPassword = false;
public string DefaultText {
get
{
return defaultText;
}
set
{
defaultText = value;
addPlaceHolder();
}
}
private void removePlaceholder()
{
Text = "";
ForeColor = System.Drawing.Color.Black;
if (isPassword)
{
PasswordChar = '\u2022';
}
}
private void addPlaceHolder()
{
Text = defaultText;
SelectionStart = 0;
SelectionLength = 0;
ForeColor = System.Drawing.Color.FromArgb(160, 160, 160);
if (isPassword)
{
PasswordChar = '\0';
}
}
private void placeHolderBox_KeyDown(object sender, System.EventArgs e)
{
if (this.Text == defaultText)
{
removePlaceholder();
}
}
private void placeHolderBox_KeyUp(object sender, System.EventArgs e)
{
if (this.Text == "")
{
addPlaceHolder();
}
}
private void placeHolderBox_Leave(object sender, System.EventArgs e)
{
if (this.Text == "")
{
addPlaceHolder();
}
}
public PlaceHolderTextBox()
{
KeyDown += new System.Windows.Forms.KeyEventHandler(placeHolderBox_KeyDown);
KeyUp += new System.Windows.Forms.KeyEventHandler(placeHolderBox_KeyUp);
Leave += new System.EventHandler(placeHolderBox_Leave);
}
}
这是它添加到我的login.designer文件
的行this.passwordBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(160)))), ((int)(((byte)(160)))), ((int)(((byte)(160)))));
经过一些谷歌搜索后,我发现可能会出现只有设计师使用的代码,说占位符颜色是新的“默认”颜色,这样设计师就不会添加该行。但如果这是真的,我无法弄清楚在我的代码中把它放在哪里。