如何解决调用InitializeComponent后未初始化C#自定义控件的属性吗?
我正在尝试创建一个简单的文本框,该文本框在未聚焦且其文本为空时显示提示文本,并在聚焦时隐藏该提示文本。为此,我通过扩展TextBox创建了一个自定义控件。
public partial class HintedTextBox : TextBox
{
private Color foreColor;
public HintedTextBox()
{
InitializeComponent();
foreColor = ForeColor;
GotFocus += OnFocused;
LostFocus += OnFocusLost;
OnFocusLost(null,null); // Problem
}
public string Hint { get; set; }
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
private void OnFocused(object sender,EventArgs e)
{
if (Text == Hint)
{
Text = "";
ForeColor = foreColor;
}
}
private void OnFocusLost(object sender,EventArgs e)
{
if (Text.Trim() == "")
{
Text = Hint;
ForeColor = Color.Gray;
}
else
{
ForeColor = foreColor;
}
}
}
从逻辑上讲,在初始化组件之后,我需要调用OnFocusLost()
过程,以便应用程序在首次显示Form时显示提示。问题出在我标记为// problem
的那一行。在这一行,即使我已经在Designer中设置了它们的值,我的自定义属性Hint
和stock属性Text
都未初始化。奇怪的是ForeColor
属性已经在该行初始化了。这些值被初始化后,还会触发另一个事件吗?还是有其他解决方案?
我还尝试了从Windows窗体的FormLoad事件的控件外部调用OnFocusLost()
。它也不起作用。 Text
和Hint
在开始时始终为空,即使在InitializeComponent()
调用之后也是如此。
感谢您的关注。
编辑:
我忘记将Form的加载事件附加到我的FormLoad()
方法上,但是Vladimir Stoyanov的解决方案运行得很好,甚至更好。
解决方法
作为一个选项,您可以仅使用Hint属性的setter。当您以后需要以编程方式更改提示时,它将处理这种情况
private string hint;
public string Hint
{
get => hint;
set
{
hint = value;
OnFocusLost(null,null);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。