C# 自定义控件的属性在 InitializeComponent() 调用后未初始化?
C# Custom Control's attribute not initialized after InitializeComponent() call?
我正在尝试创建一个简单的文本框,它在未获得焦点且文本为空时显示提示文本,并在获得焦点时隐藏提示文本。为此,我通过扩展 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()
过程,以便应用程序在首次显示表单时显示提示。问题出在我用 // problem
标记的那一行。在这一行,我的自定义属性 Hint
和库存属性 Text
都没有初始化,即使我已经在设计器中设置了它们的值。奇怪的是 ForeColor
属性已经在该行进行了初始化。是否有另一个事件在这些值初始化后立即触发,或者是否有任何其他解决方案?
我也试过在 Windows 表单的 FormLoad 事件上从控件外部调用 OnFocusLost()
。它也不起作用。 Text
和 Hint
在开始时总是空的,即使在 InitializeComponent()
调用之后也是如此。
感谢您的关注。
编辑:
我忘记将表单的加载事件附加到我的 FormLoad()
方法,但尽管如此,Vladimir Stoyanov 的解决方案工作得很好,甚至更好。
作为一个选项,您可以只使用提示 属性 的 setter。它将处理稍后需要以编程方式更改提示的情况
private string hint;
public string Hint
{
get => hint;
set
{
hint = value;
OnFocusLost(null, null);
}
}
我正在尝试创建一个简单的文本框,它在未获得焦点且文本为空时显示提示文本,并在获得焦点时隐藏提示文本。为此,我通过扩展 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()
过程,以便应用程序在首次显示表单时显示提示。问题出在我用 // problem
标记的那一行。在这一行,我的自定义属性 Hint
和库存属性 Text
都没有初始化,即使我已经在设计器中设置了它们的值。奇怪的是 ForeColor
属性已经在该行进行了初始化。是否有另一个事件在这些值初始化后立即触发,或者是否有任何其他解决方案?
我也试过在 Windows 表单的 FormLoad 事件上从控件外部调用 OnFocusLost()
。它也不起作用。 Text
和 Hint
在开始时总是空的,即使在 InitializeComponent()
调用之后也是如此。
感谢您的关注。
编辑:
我忘记将表单的加载事件附加到我的 FormLoad()
方法,但尽管如此,Vladimir Stoyanov 的解决方案工作得很好,甚至更好。
作为一个选项,您可以只使用提示 属性 的 setter。它将处理稍后需要以编程方式更改提示的情况
private string hint;
public string Hint
{
get => hint;
set
{
hint = value;
OnFocusLost(null, null);
}
}